【发布时间】:2017-07-24 02:17:12
【问题描述】:
我正在尝试使用 Django Rest Framework 模块 drf-chunked-upload 分块发送大文件。
但是按照典型用法部分并在过去两天尝试了各种方法,我找不到这样做的方法。
我做的第一件事是使
ChunkedUpload模型具体化,以便在我的项目中使用它,然后制作并运行与此相关的迁移。-
之后我将
url设置为在urls.py中发出请求:url(r'^uploadchunks/$', ChunkedUploadView.as_view()) 现在,我可以按照 Github 项目主页的典型用法部分第 1 项向 API 发出请求:
初始 PUT 请求被发送到链接到 ChunkedUploadView 的 url (或任何子类)与文件的第一个块。的名称 可以在视图中覆盖chunk文件(类属性field_name)
-
使用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//5230ec1f59d1485d9d7974b853802e31p>
{ “我的文件”:文件}
然后我跑:
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