【问题标题】:Django: store InMemoryUploadedFile on the diskDjango:将 InMemoryUploadedFile 存储在磁盘上
【发布时间】:2012-08-02 13:24:30
【问题描述】:

我有预先通过 AJAX 上传文件的 HTML 表单。所以在 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 类型的对象的想法。但在某些情况下,我会收到大小

所以,我想执行以下操作 - 通过 ajax 上传的每个文件都应该临时存储。并且内存不是一个好地方 - 因为最终重新存储文件(在表单提交之后)不会在内存中包含有关此文件的信息。所以,任务是将 InMemoryUploadedFile “转换”为 TemporaryUploadedFile - 有可能吗?

PS

也许我应该简单地从 InMemoryUploadedFile 对象读取文件内容并将其手动写入磁盘(例如 /tmp 目录)。你觉得怎么样?

PPS

还有一个问题 - 事先上传到临时目录是个好主意吗?:) 在我的情况下,表单有 6 个 input[type=file] 元素,每个元素都上传不同的文件类型(六个用于 UI需要)。

TIA!

【问题讨论】:

    标签: django forms


    【解决方案1】:

    您可以在 settings.py 中覆盖 FILE_UPLOAD_HANDLERS 中的默认值

    # only use TemporaryFileUploadHandler for file uploads
    FILE_UPLOAD_HANDLERS = (
        'django.core.files.uploadhandler.TemporaryFileUploadHandler',
    )
    

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 2012-05-13
      • 2012-01-20
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2011-10-04
      • 2020-07-18
      • 1970-01-01
      相关资源
      最近更新 更多