上传的django图像以错误的文件名结尾

时间:2010-01-18 20:45:10

标签: django image-upload

我不知道这是否是预期的行为,但如果我使用带有ImageField字段的单个模型创建项目并上传文件名为“árvórés”的照片,则上传的文件将以难以理解的文件名保存(ascii,我推测)。直接结果是,该照片无法从网站上检索。

这是正常的吗?如果是,那么如何允许这些类型的文件名?

1 个答案:

答案 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')
            ...