Django Rest Framework模块drf-chunked-upload - 上传块不起作用

时间:2017-03-03 20:27:20

标签: python django file-upload django-rest-framework

我正在尝试使用Django Rest Framework模块drf-chunked-upload以块的形式发送大文件。

但是按照“典型用法”部分的说法,过去两天尝试了各种方法,我找不到办法。

  1. 我做的第一件事就是让ChunkedUpload模型具体在我的项目中使用它,然后制作并运行与之相关的迁移。

  2. 之后我设置了url以在urls.py中发出请求:

    url(r'^uploadchunks/$', ChunkedUploadView.as_view())
    
  3. 现在,我可以按照Github项目主页第1项中的“典型用法”部分向API发出请求:

  4.   

    初始PUT请求被发送到链接到ChunkedUploadView的URL   (或任何子类)与文件的第一个块。的名字   可以在视图中重写块文件(类属性field_name)

    1. 使用httpie发出我运行的请求(整个文件有32095676个字节,我的发送时间为1000000):

      http -a <username>:<password> -f PUT http://127.0.0.1:8000/uploadchunks/ file@~/<first_filechunk> filename='file' 'Content-Range: bytes 0-10000000/32095676'
      
    2. 之后我收到错误:

      django.urls.exceptions.NoReverseMatch: Reverse for 'chunkedupload-detail' with arguments '()' and keyword arguments '{'pk': UUID('a6b2f690-1653-4821-bcfd-b0edce60948a')}' not found. 0 pattern(s) tried: []
      

      虽然“典型用法”部分的第2项说我们应该收到回复:

        

      作为回报,服务器将使用上传的网址进行响应   当前偏移量,以及上传过期(到期)。例如:

      {
          "url": "https://your-host/<path_to_view>/5230ec1f59d1485d9d7974b853802e31",
          "offset": 10000,
          "expires": "2013-07-18T17:56:22.186Z" 
      }
      

      我一直想知道上面的错误消息是否指的是缺少的View(ChunkedUploadDetailView?),所以我使用基本代码创建了该视图:

      class ChunkedUploadDetailView(generics.RetrieveAPIView):
          queryset = ChunkedUpload.objects.all()
          serializer_class = ChunkedUploadSerializer
      

      使用url conf

      url(r'^uploadchuncks/(?P<pk>.*)/$', views.ChunkedUploadDetailView,
              name='chunkedupload-detail')
      

      现在,我可以发送第一个文件块,然后收到响应:

      HTTP/1.0 200 OK
      Allow: GET, POST, PUT, HEAD, OPTIONS
      Content-Type: application/json
      Date: Fri, 03 Mar 2017 19:20:46 GMT
      Server: WSGIServer/0.2 CPython/3.6.0+
      Vary: Accept, Cookie
      X-Frame-Options: SAMEORIGIN
      
      {
          "completed_at": null,
          "created_at": "2017-03-03T19:20:46.502345Z",
          "file": "http://127.0.0.1:8000/uploadchunks/chunked_uploads/2017/03/03/1c469fab-1d0c-4c14-84b3-0d51aa36c8f2.part",
          "filename": "file0",
          "id": "1c469fab-1d0c-4c14-84b3-0d51aa36c8f2",
          "offset": 10000000,
          "status": 1,
          "url": "http://127.0.0.1:8000/uploadchuncks/1c469fab-1d0c-4c14-84b3-0d51aa36c8f2/",
          "user": 2
      }
      

      来自httpie

      所以,我认为我是在正确的方式,但现在当我按照典型用法部分的第三项时:

        

      将后续块重复PUT到服务器返回的url。   例如:

           

      #PUT to   https://your-host/ / 5230ec1f59d1485d9d7974b853802e31

           

      {       “my_file”:file}

      我跑:

      http -a indc:indc@indc -f PUT http://127.0.0.1:8000/uploadchunks/1c469fab-1d0c-4c14-84b3-0d51aa36c8f2/ file@~/Downloads/<second_filechunk> filename='file' 'Content-Range: bytes 10000000-20000000/32095676'
      

      发送第二个文件块我得到shell错误:

      http: error: ConnectionError: ('Connection aborted.', BrokenPipeError(32, 'Broken pipe')) while doing PUT request to URL: http://127.0.0.1:8000/uploadchunks/1c469fab-1d0c-4c14-84b3-0d51aa36c8f2/
      

      ,在django虚拟服务器中:

      Not Found: /uploadchunks/1c469fab-1d0c-4c14-84b3-0d51aa36c8f2/
      [03/Mar/2017 16:29:22] "PUT /uploadchunks/1c469fab-1d0c-4c14-84b3-0d51aa36c8f2/ HTTP/1.1" 404 4788
      

      模块似乎无法找到与之关联的模型实例 pk=1c469fab-1d0c-4c14-84b3-0d51aa36c8f2

      所以我在这里呆了两天。

      由于我是一名新的python / django开发人员,直到现在我找不到解决问题的方法。在我看来,有些东西我必须实现,但我不知道为什么。

      如果有人已经使用过drf-chunked-upload,并且知道我缺少什么,我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在url中,我看到您在某些地方拼写为“ uploadchunks”,而在其他地方拼写为“ uploadchuncks”。这可能是原因。