我不知道这是否是预期的行为,但如果我使用带有 ImageField 字段的单个模型创建项目并上传文件名为“árvórés”的照片,则上传的文件会以难以理解的文件名(ascii,我相信)。直接结果是,无法从该站点检索该照片。
这是正常的吗?如果是,那么如何允许这些类型的文件名?
我不知道这是否是预期的行为,但如果我使用带有 ImageField 字段的单个模型创建项目并上传文件名为“árvórés”的照片,则上传的文件会以难以理解的文件名(ascii,我相信)。直接结果是,无法从该站点检索该照片。
这是正常的吗?如果是,那么如何允许这些类型的文件名?
问题是您尚未指定浏览器应如何编码 POST 数据,随后您将得到浏览器猜测它应该使用的任何内容 - 通常是 ISO-8859-1 而不是 Unicode (UTF-8)。
FORM 元素的 HTML 4.01 规范包括“accept-charset”属性,它允许您指定您对使用哪种编码来发布数据的偏好:
接受字符集= 字符集列表 [CI]
此属性指定处理此表单的服务器接受的输入数据的字符编码列表。该值是以空格和/或逗号分隔的字符集值列表。客户端必须将此列表解释为异或列表,即服务器能够接受每个接收到的实体的任何单个字符编码。
此属性的默认值是保留字符串“UNKNOWN”。用户代理可以将此值解释为用于传输包含此 FORM 元素的文档的字符编码。
换句话说,如果您提供一个以 UTF-8 编码的页面,浏览器将默认以 UTF-8 发布请求。
最好的解决方法是通过在响应标头中包含适当的编码或在 HTML 的 HEAD 部分中包含类似以下内容来指定所有页面的字符编码:
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
HTML 4.01 规范有一节介绍如何指定您所提供的字符编码。
另一种但较小的解决方法是不在任何地方指定字符编码,而是手动解码您的文件名,假设浏览器以 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')
...