【发布时间】:2014-01-21 23:50:01
【问题描述】:
我正在尝试制作一个将文件上传到文件夹的 python 脚本。一切正常,除了我尝试用日文文本保存一个名称的文件,它被切断了。它像 somefile__.zip 一样出来,下划线是日文文本所在的位置。在文件的顶部我设置了 coding: utf-8 但这没有任何效果。这是安全文件名功能的问题还是我遗漏了什么?我的文件管理器可以很好地显示名称中带有日文字符的文件,所以这不是问题。
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
if is_image(file.filename):
filename = shortuuid.uuid()[:7] + "." + file.filename.rsplit(".", 1)[1]
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
else:
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
【问题讨论】:
-
你在什么平台上?如果是 Windows,您的 OEM 代码页是什么?如果是 Unix,你的默认语言环境是什么? (如果是 OS X,就这么说,我们已经知道答案了。)
-
添加
coding: utf-8只会影响代码中用于字符串文字的编码,例如"."和'file',这显然与您的问题无关。请阅读Unicode HOWTO 并确保您了解问题(如果您仍然不了解,请查看底部的链接以及著名的Spotsky blog);像这样随意改变事情对你没有帮助。 -
另外,
secure_filename函数是从哪里来的?如果它在您的代码中,请向我们展示代码;如果它来自某个图书馆,请告诉我们是哪一个。 -
更重要的是,
request来自哪里?它是什么类型的? -
@abarnert secure_filename 来自 werkzeug utils werkzeug.pocoo.org/docs/utils。正如有人已经说过的那样,它看起来像是只返回一个 ASCII 字符串。该死。我搜索了这个实用程序的 unicode 版本,但什么也没找到。我什至要如何编写自己的版本?从网站上提供的示例来看,它看起来像是从文件名中删除斜杠并用下划线替换空格 - 只需编写一个函数来执行此操作并吐出一个 unicode 字符串就足够了吗?