python - 上传 django rest framework api 时文件(pdf 除外)损坏

标签 python django django-rest-framework

嘿,我遇到了一点问题。我写了一个 django restframework api 用于将文件上传到我的本地目录。就 pdf 而言,它似乎工作得很好,但任何其他类型的格式都会损坏文件并使其无法打开。

(这包括 png/jpg/任何其他图片格式、txt 文件、xlsx 文件等) 这些文件保存在正确的路径中非常好,它们被适本地命名没有问题。

class UploadInvoiceFile(APIView):
     parser_classes = (FileUploadParser, MultiPartParser)

     def put(self, request, filename, specific_path='admin'):
         file_obj = request.data['file']
         file_path = settings.INVOICE_URL[admin]
         file = file_path+'/'+filename

         if not os.path.exists(file_path):
             os.makedirs(file_path)
         with open(file, 'wb+') as destination:
             for chunk in file_obj.chunks():
                 destination.write(chunk)



         return Response(status=204)

更新: 我发现被篡改的文件中保存了额外的内容

------WebKitFormBoundaryKDALl9LeBZb6xbOo Content-Disposition:表单数据;名称="file";文件名="123.txt" 内容类型:文本/纯文本

文件数据

------WebKitFormBoundaryKDALl9LeBZb6xbOo--

最佳答案

FileUploadParser 假定传入请求是原始字节流并将其作为一个整体进行解析。通常是 listed on its ownparser_classes 中,因为它将为任何类型的传入数据激活。

在您的情况下,您正在发送一个由 FileUploadParser 拾取的多部分请求,并且整个事情 - 边界和所有 - 保存为一个文件。因此,您会在文件中看到 WebKitFormBoundary

您应该从 parser_classes 中删除 FileUploadParser 并让 MultiPartParser 正确解析多部分请求。

class UploadInvoiceFile(APIView):
     parser_classes = (MultiPartParser, )

关于python - 上传 django rest framework api 时文件(pdf 除外)损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53344881/

相关文章:

django - 将两个不同的序列化程序组合成一个返回命名 JSON 数组的 View

python - 在 numpy (python) 中定义和乘以矩阵

python - Django 复选框只想选中第一个框

django - 适用于 Google App Engine 的最佳 Django 功能?

Django-Socialauth - 如何将多个身份验证提供程序关联到单个用户帐户

python - ModelViewSet API 端点是什么

python - Django REST 框架和文件上传(数据 URI)

python - 暂停 Python 控制台

python - Django:如何将随机函数生成的变量存储在数据库中?

python - 尝试通过 python 控制 DGH D8500 modbus