我不知道这是否是预期的行为,但如果我使用带有ImageField字段的单个模型创建项目并上传文件名为“árvórés”的照片,则上传的文件将以难以理解的文件名保存(ascii,我推测)。直接结果是,该照片无法从网站上检索。
这是正常的吗?如果是,那么如何允许这些类型的文件名?
答案 0 :(得分:3)
问题是你没有指定浏览器应该如何编码POST数据,随后你得到了浏览器应该使用的任何东西 - 通常是ISO-8859-1而不是Unicode(UTF-8) )。
FORM元素的HTML 4.01规范包含“accept-charset”属性,该属性允许您指定使用以下内容对POST数据进行编码的首选项:
accept-charset =字符集列表[CI]
此属性指定列表 输入数据的字符编码 这是服务器接受的 处理此表格。价值是 空格和/或逗号分隔的列表 charset值。客户必须 将此列表解释为独占或 列表,即服务器能够 接受任何单个字符编码 每个实体收到。
此属性的默认值 是保留字符串“UNKNOWN”。用户 代理商可以将此值解释为 用于的字符编码 传输包含此文件的文件 FORM元素。
换句话说,如果您提供以UTF-8编码的页面,浏览器将默认以UTF-8发布请求。
最好的解决方法是通过在响应标头中包含适当的编码,或在HEAD部分的HTML中包含以下内容,为所有网页指定字符编码:
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
HTML 4.01规范中有how to specify which character encoding you are serving部分。
另一个较小的修复方法是不在任何地方指定字符编码,而是手动解码文件名,假设浏览器使用ISO-8859-1的默认编码发送:
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
filename = form.cleaned_data.image.name.decode('iso-8859-1')
...