Django Rest 框架和文件上传
Posted
技术标签:
【中文标题】Django Rest 框架和文件上传【英文标题】:Django Rest Framework and File Upload 【发布时间】:2016-02-16 18:08:43 【问题描述】:我正在尝试使用 DRF 和 jQuery 构建文件上传。我用谷歌搜索发现this sample。我在后端有一些类似的代码:
class Attachment(BaseModel):
file = models.FileField(upload_to=get_photo_path)
class AttachmentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Attachment
fields = ('id', 'file')
class AttachmentViewSet(viewsets.ModelViewSet):
parser_classes = (FileUploadParser, )
serializer_class = serializers.AttachmentSerializer
queryset = models.Attachment.objects.all()
def pre_save(self, obj):
obj.file = self.request.FILES.get('file')
并尝试将 Angular 示例转换为 jQuery
var fd = new FormData()
fd.append('file', file) // file from file-field
var reader = new FileReader()
$.ajax(
url: 'http://localhost:8001/files/',
data: fd,
processData: false,
contentType: false,
type: 'POST'
).done(...
由于某些原因,我在尝试上传文件时出现后端错误:
detail: "FileUpload parse error - none of upload handlers can handle the stream"
【问题讨论】:
【参考方案1】:其实问题出在一种解析器上。我应该使用(FormParser, MultiPartParser, )
而不是(FileUploadParser, )
【讨论】:
【参考方案2】:默认的 Django 上传处理程序是:
["django.core.files.uploadhandler.MemoryFileUploadHandler", "django.core.files.uploadhandler.TemporaryFileUploadHandler"]
并且app设置文件中默认没有FILE_UPLOAD_HANDLERS参数。
在我的例子中,我排除了 MemoryFileUploadHandler 并设置了
FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHandler", ]
在应用程序设置文件中,它解决了问题。
【讨论】:
以上是关于Django Rest 框架和文件上传的主要内容,如果未能解决你的问题,请参考以下文章
Django rest 框架 - 将图像上传到 Azure 存储
有没有办法使用 Django REST 框架中的可浏览 API 上传文件?
如何使用 django-rest-framework 测试客户端测试二进制文件上传?