Python 如何使用django rest框架上载非ascii文件名的文件

Python 如何使用django rest框架上载非ascii文件名的文件,python,django,post,file-upload,django-rest-framework,Python,Django,Post,File Upload,Django Rest Framework,我正在使用Django Rest框架3.4.4和Django 1.10。 这是客户端的post请求: $http.post(fileUrl, fd, { withCredentials: true, transformRequest: angular.identity, headers: { 'Content-Type': undefined } }).success(function(data) { .... 在服务器端,我有以下内容: def

我正在使用Django Rest框架3.4.4和Django 1.10。 这是客户端的post请求:

$http.post(fileUrl, fd, {
    withCredentials: true,
    transformRequest: angular.identity,
    headers: {
        'Content-Type': undefined
    }
}).success(function(data) {
....
在服务器端,我有以下内容:

def post(self, request, format=None):
    file_ids = []
    file_list = request.FILES.getlist('file_path')
    for file in file_list:
        serializer = FileSerializer(data={'file_path': file})
        if serializer.is_valid():
            serializer.save()
....
使用filname(如foo.pdf)可以正确上载文件。但当文件名包含亚美尼亚字母:ա.pdf时,我得到了UnicodeEncodeError错误: ,
.

这很可能意味着您没有设置系统语言变量

一些帮助运行Django projet的应用程序(例如supervisor)不考虑默认系统。有时你需要自己设置

你很可能会错过:

  • LANG=“C.UTF-8”
  • LC_ALL=“C.UTF-8”
  • LC_LANG=“C.UTF-8”

例如。

这很可能意味着您没有设置系统语言变量

一些帮助运行Django projet的应用程序(例如supervisor)不考虑默认系统。有时你需要自己设置

你很可能会错过:

  • LANG=“C.UTF-8”
  • LC_ALL=“C.UTF-8”
  • LC_LANG=“C.UTF-8”
例如。

您还可以尝试在模型的保存方法中输入文件名。您可以从中找到如何覆盖模型的保存方法。想法是在保存对象之前,更改文件名。ın代替“ա.pdf”,Slagify可能会将其更改为“w.pdf”。您还可以添加
#-*-编码:utf-8-*-
在视图的顶部,如。

您还可以尝试在模型的保存方法中输入文件名。您可以从中找到如何覆盖模型的保存方法。想法是在保存对象之前,更改文件名。ın代替“ա.pdf”,Slagify可能会将其更改为“w.pdf”。您还可以添加
#-*-编码:utf-8-*-

在视图顶部,如。

您应该在问题中发布回溯(指向外部站点的链接过时)。django错误页面中有一个按钮用于获取副本和可粘贴的回溯。至于您的问题,在尝试将文件名保存到服务器的文件系统之前,您需要清理文件名。我没有足够的声誉直接在问题中嵌入图像,因此steckoverflow系统包含该链接。当然,“复制和粘贴回溯”是正确的方法。我将尽快对此提出质疑。感谢您的输入。您应该在问题中发布回溯(指向外部站点的链接过时)。django错误页面中有一个按钮用于获取副本和可粘贴的回溯。至于您的问题,在尝试将文件名保存到服务器的文件系统之前,您需要清理文件名。我没有足够的声誉直接在问题中嵌入图像,因此steckoverflow系统包含该链接。当然,“复制和粘贴回溯”是正确的方法。我将尽快对此提出质疑。谢谢你的投入,谢谢你的精彩表演<代码>#-*-编码:utf-8-*-没有帮助@利诺维亚的答案是正确的。我没有设置系统语言变量。谢谢你的妙计<代码>#-*-编码:utf-8-*-没有帮助@利诺维亚的答案是正确的。我没有设置系统语言变量。我正在运行Docker,当我在交互式Python shell中检查配置时,我没有得到UTF-8,正如前面提到的链接中所注意到的,建议使用LANG环境变量设置预期编码:export LANG=“en_US.UTF-8”我很惊讶它没有帮助(当我找到原因后,我会写在这里)。但在设置了您指定的变量后,sys.getfilesystemencoding()输出变成UTF-8,并按预期上载了非ascii名称的文件。非常感谢。很高兴这能有所帮助。我花了一些时间来计算发生在我身上的情况:)我正在运行Docker,当我在交互式Python shell中检查我的配置时,我没有得到UTF-8,正如前面提到的链接中所注意到的那样,建议使用LANG环境变量export LANG=“en_US.UTF-8”设置预期编码,我惊讶地发现它没有帮助(我将在这里写下,当我发现为什么会发生这种情况)。但在设置了指定的变量后,sys.getfilesystemencoding()输出变成UTF-8,并按预期上载了具有非ascii名称的文件。非常感谢。很高兴这能帮上忙。我花了一些时间去想这些事情发生在我身上的时候:)