为什么在 html 文件上传时会删除 uri 字符(或至少是空格)?

Why are uri chars (or at least spaces) being dropped on an html file upload?

我有一个文件上传表单,想使用服务器上的文件名,但我注意到上传时空格被删除了。在 client/browser 上,我可以在输入类型='file' 元素更改后调用的事件中执行类似的操作:

function process_svg (e) {
    var files = e.target.files || e.originalEvent.dataTransfer.files;
    console.log(files[0].filename);

如果我上传名为 'some file - type.ext' 的文件,'some file - type.ext' 将打印在控制台中。在服务器上 (运行ning bottle) 但是如果我 运行:

@route('/some_route')
def some_route():
    print(request.files['form_name_attr'].filename)

我明白了 'somefile-type.ext.' 我猜这与 uri 转义(或缺少 uri 转义)有关,但由于您无法更改文件预上传,您如何解决这个问题并保留它?奇怪的是,我在 google 上找不到对此的提及,部分原因是我在考虑适当的搜索词时遇到了麻烦,但我也知道这实际上可能不是本机行为,而是我代码中其他地方的错误。

我认为情况并非如此,因为我已经发出了这些 console.log 并在结尾(上传前)和开头(服务器开始处理请求时)打印语句并执行不相信我真的有任何代码可以在两者之间触摸它,但是如果是这种情况请告诉我,因为我可能看错了方向。

你想要 raw_filename,而不是 filename

(注意可能包含不安全字符。)

@route('/some_route', method='POST')
def some_route():
    print(request.files['form_name_attr'].filename)  # "cleaned" file name
    print(request.files['form_name_attr'].raw_filename)  # unmodified file name

FileUpload.filename 的源代码中找到这个:

Only ASCII letters, digits, dashes, underscores and dots are allowed in the final filename. Accents are removed, if possible. Whitespace is replaced by a single dash. Leading or tailing dots or dashes are removed. The filename is limited to 255 characters.