我有HTML表单,可以通过AJAX事先上传文件。所以在django后端我有以下View代码,它处理这个AJAX调用:
@csrf_exempt
def book_upload(request):
if request.method == 'POST':
log.info('received POST to main book_upload view')
if request.FILES is None:
return HttpResponseBadRequest('Must have files attached!')
log.info('request has FILES')
file_types = (u'file_pdf', u'file_djvu', u'file_doc', u'file_epub', u'file_djvu', u'file_fb2', u'file_txt', u'file_chm', u'file_other');
file = None
file_type = None
for ft in file_types:
if ft in request.FILES:
file = request.FILES[ft]
file_type = ft
break
if file is None:
return HttpResponseBadRequest('Bad file type')
file_path = file.temporary_file_path()
result = {"path": file_path, "format": file_type}
response_data = simplejson.dumps(result)
if "application/json" in request.META['HTTP_ACCEPT_ENCODING']:
mimetype = 'application/json'
else:
mimetype = 'text/plain'
return HttpResponse(response_data, mimetype=mimetype)
else:
return HttpResponse('Only POST accepted')
但是这段代码存在问题。它适用于超过2.5 MB的文件(因为使用TemporaryUploadedFile,文件大小默认设置为> 2.5 mb)。因此,此代码基于request.FILES包含具有TemporaryUploadedFile类型的对象的想法。但在某些情况下,我会收到大小为< 2.5 mb。 request.FILES包含InMemoryUploadedFile。
所以,我想要做以下事情 - 通过ajax上传的每个文件都应该是临时存储的。并且内存不是一个好地方 - 因为最终重新存储文件(在表单提交之后)将不会在内存中有关于此文件的信息。因此,任务是将InMemoryUploadedFile“转换”为TemporaryUploadedFile - 这可能吗?
PS
也许我应该简单地从InMemoryUploadedFile对象中读取文件内容并手动将其写入磁盘(例如,到/ tmp目录)。你觉得怎么样?
PPS
另外一个问题 - 先上传到临时目录是个好主意吗?:)在我的情况下,表单有6个输入[type = file]元素,每个元素都上传不同的文件类型(六个用于UI需要)。
TIA!
答案 0 :(得分:3)
您可以覆盖settings.py
中FILE_UPLOAD_HANDLERS
的默认值
# only use TemporaryFileUploadHandler for file uploads
FILE_UPLOAD_HANDLERS = (
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
)