FileUploadParser
Django REST framework 提供了 parsers.FileUploadParser 类,可以用来处理原始格式的文件内容的上传。后端获取到的 request.data 为字典结构,其中包含的 'file' 键对应的值即为上传的文件对象。
如果 FileUploadParser 类被包含 filename 参数的 URL 调用,则该参数会作为文件保存到服务端后的文件名。若 URL 中不包含 filename 参数,则客户端发起的请求必须包含 Content-Disposition 请求头及 filename 参数。如 Content-Disposition: attachment; filename=upload.jpg。
示例代码
# views.pyfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework.parsers import FileUploadParserclass FileUploadView(APIView):parser_classes = [FileUploadParser, ]def put(self, request, filename, format=None):file_obj = request.data['file']with open(filename, 'wb') as f:for chunk in file_obj.chunks():f.write(chunk)return Response(f'{filename} uploaded',status=204)
# urls.pyfrom django.urls import re_pathurlpatterns = [re_path(r'^files/(?P<filename>[^/]+)$', views.FileUploadView.as_view()),]
上传接口的 URL 为 [http://xx.xx.xx.xx/files/<filename>](http://xx.xx.xx.xx/files/%3Cfilename%3E) ,其中 <filenmae> 用于指定上传成功后在服务器端的文件名。客户端使用 PUT 请求上传文件。
使用 postman 测试文件上传,截图如下:
postman
前端上传代码示例如下(使用 jQuery,有可能出现跨域问题,可参考网上资料解决):
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>文件上传</title></head><body><form><p>上传文件: <input type="file" name="files" id='files' /></p><input type="button" value="上传" onclick="doUpload()" /></form><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script><script type="text/javascript">function doUpload() {$.ajax({url: 'http://xx.xx.xx.xx:8000/files/test.jpg',type: 'PUT',data: $('#files')[0].files[0],cache: false,processData: false,contentType: false,async: false}).done(function (res) {alert("上传成功")}).fail(function (res) {alert("上传失败:" + res)});}</script></body></html>
作者:rollingstarky
链接:https://www.jianshu.com/p/82cb876bb426
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
