我正在尝试使用Django Rest Framework模块drf-chunked-upload以块的形式发送大文件。
但是按照“典型用法”部分的说法,过去两天尝试了各种方法,我找不到办法。
我做的第一件事就是让ChunkedUpload
模型具体在我的项目中使用它,然后制作并运行与之相关的迁移。
之后我设置了url
以在urls.py
中发出请求:
url(r'^uploadchunks/$', ChunkedUploadView.as_view())
现在,我可以按照Github项目主页第1项中的“典型用法”部分向API发出请求:
初始PUT请求被发送到链接到ChunkedUploadView的URL (或任何子类)与文件的第一个块。的名字 可以在视图中重写块文件(类属性field_name)
使用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'
之后我收到错误:
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,并且知道我缺少什么,我感谢任何帮助。
答案 0 :(得分:0)
在url中,我看到您在某些地方拼写为“ uploadchunks”,而在其他地方拼写为“ uploadchuncks”。这可能是原因。