gpt4 book ai didi

python - 将文件数据流式传输到 mongodb gridfs

转载 作者:行者123 更新时间:2023-12-01 05:10:49 25 4
gpt4 key购买 nike

我正在尝试使用服务器上的 django + mongoengine 将视频文件上传到 gridfs。

客户端:(使用 JavaScript 读取/分块文件并使用 ajax 将数据发送到服务器。)

_upload : function() {
chunk = self.file.slice( self.start, self.end );
reader = new FileReader();
reader.readAsDataURL( chunk );
reader.onload = function(e) {
this.request = new XMLHttpRequest();
this.request.open( 'POST', '/ajax/video_upload/' );
this.request.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
this.request.overrideMimeType('application/octet-stream');
this.request.send( JSON.stringify({ 'chunk': e.target.result, 'id' : self.file_id }) );
this.request.onload = function() {

if( self.start >= self.file_size && self.preventedOverflow ) {
return;
}

self.start = self.end;
self.end = self.end + self.chunkSize;

self._upload();
};
}

服务器端:

def uploadVideo(request):
if request.body and request.is_ajax:
data = json.loads(request.body)
m = Multimedia.objects.get( id = data['id'] )
m.media.new_file()
m.media.write( data['chunk'] )
m.media.close()
m.save()
return HttpResponse()

错误:

ERROR:django.request:Internal Server Error: /ajax/video_upload/
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/home/praveen/Desktop/gatherify/gatherify/../ajax/views.py", line 33, in uploadVideo
m.media.write( data['chunk'] )
File "/usr/local/lib/python2.7/dist-packages/mongoengine-0.8.7-py2.7.egg/mongoengine/fields.py", line 1172, in write
self.newfile.write(string)
File "build/bdist.linux-i686/egg/gridfs/grid_file.py", line 327, in write
"order to write %s" % (text_type.__name__,))
TypeError: must specify an encoding for file in order to write unicode

我不知道如何指定编码,官方文档没有提及。 (http://mongoengine-odm.readthedocs.org/guide/gridfs.html)

另一个问题是,当我尝试在下一个 ajax 请求上写入下一个 block 时,我收到错误:

GridFSError: This document already has a file. Either delete it or call replace to overwrite it

感谢任何帮助。谢谢:)

最佳答案

data['chunk'] 进行编码字符串,然后将其写入 FileField。

m.media.new_file()
m.media.write( data['chunk'].encode("UTF-8") )
m.media.close()

至于你的第二个问题,你已经在 gridfs 中创建了一个文件。正如错误消息所示,您必须 m.media.delete()它或 m.media.replace(<a new gridfs entry>)它。如果您想附加它,您可能必须 m.media.get()文件内容作为字符串,将新 block 附加到字符串,然后创建一个新的 m.media gridfs 文件。您无法直接编辑 gridfs 内容。

关于python - 将文件数据流式传输到 mongodb gridfs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24270876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com