【问题标题】:Django Rest Framework module drf-chunked-upload - upload chunk does not workDjango Rest Framework 模块 drf-chunked-upload - 上传块不起作用
【发布时间】:2017-07-24 02:17:12
【问题描述】:

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

但是按照典型用法部分并在过去两天尝试了各种方法,我找不到这样做的方法。

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

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

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

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

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

    http -a <username>:<password> -f PUT http://127.0.0.1:8000/uploadchunks/ file@~/<first_filechunk> filename='file' 'Content-Range: bytes 0-10000000/32095676'
    

之后我得到错误:

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, 当前偏移量,以及上传何时过期(过期)。示例:

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

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

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

带有网址配置

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

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

重复地将后续块放入从服务器返回的 url。 示例:

#PUT 到 https://your-host//5230ec1f59d1485d9d7974b853802e31​​p>

{ “我的文件”:文件}

然后我跑:

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,并且知道我缺少什么,我很感激任何帮助。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 2016-02-04
    • 2021-11-05
    • 1970-01-01
    • 2016-05-13
    • 2019-09-15
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多