2012-08-05 271 views
1

我有通過AJAX預先上傳文件的HTML表單。因此,在Django的後端我查看下面的代碼,這AJAX調用該過程:Django:在磁盤上存儲InMemoryUploadedFile

@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!

回答

3

您可以覆蓋FILE_UPLOAD_HANDLERS默認settings.py中

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

THX!它已經完成了!:-) – dizpers 2012-08-05 15:30:18