我正在使用Valumns File Uploader将文件加载到 django。这支持XHR
现代浏览器的 ajax 上传和 IE 等旧浏览器的 iFrame 后备。
现在的问题:如果我上传大文件,只有 iFrame 上传有效,因为这里文件被映射到request.FILES
,django 立即将它们写入磁盘而不是内存。
如果XHR
使用上传,我必须读取 request._raw_post_data 并将其写入磁盘,但它失败并显示MemoryError
.
这是我的文件上传器初始化:
var uploader = new qq.FileUploader({
'action': uploadUrl,
'multiple': true,
'allowedExtensions': allowedExtensions,
'element': selector,
'debug': true,
'onComplete': completeFunction,
'onProgress': progressFunction,
'onSubmit': submitFunction
});
在 django 端,我使用以下代码将文件内容写入磁盘:
# open a new file to write the contents into
new_file_name = str(uuid.uuid4())
destination = open(upload_path + new_file_name, 'wb+')
# differentiate between xhr (Chrome, FF) and pseudo form uploads (IE)
if len(request.FILES) > 0: # IE
for chunk in request.FILES[0].chunks():
destination.write(chunk)
else: # others
destination.write(request._raw_post_data)
destination.close()
我也尝试了 Alex Kuhl 的这个解决方案,但是失败了IOError: request data read error
。
有什么方法可以将文件上传XHR
到request.FILES
并使用 django 内置处理?