django中處理檔案上傳檔案,django上傳檔案
1 template模版檔案uploadfile.html
特別注意的是,只有當request方法是POST,且發送request的<form>有屬性enctype="multipart/form-data"時,request.FILES中包含檔案資料,否則request.FILES為空白。
<form method="post" action="" enctype="multipart/form-data" ><input type="file" name="personico" /><br /><br /><br /><input type="submit" value="提交"/></form><img src="/static/jpg/{{personico}}" width="100px" height="100px" alt="頭像" />
2 視圖函數
if request.method == "POST": f = request.FILES.get('personico') baseDir = os.path.dirname(os.path.abspath(__name__)); jpgdir = os.path.join(baseDir,'static','jpg'); filename = os.path.join(jpgdir,f.name); fobj = open(filename,'wb'); for chrunk in f.chunks(): fobj.write(chrunk); fobj.close(); return render_to_response('uploadfile.htm',{'personico':f.name}); else: return render_to_response('uploadfile.htm');
此處說明:將上傳的檔案存放在工程目錄下的static/jpg/目錄下,檔案名稱就是上傳的檔案名稱,只是實驗性的所以沒有加錯誤驗證,如果用於生產環境,需要嚴格驗證,比如檔案是否存在、讀寫錯誤等。
上傳的檔案在request.FILES,是一個近似字典類型的資料類型,擁有基本的4個基本屬性,name檔案名稱/size檔案大小(以位元組為單位)/content_type檔案類型/read檔案內容
擁有的方法chunks()返回一個上傳檔案的分塊產生器,有一個選擇性參數是設定每次讀取的位元組數。如果上傳的檔案很大,使用這個方法可以節省記憶體,不會一下子佔用大量記憶體空間。
上傳檔案儲存的位置
儲存上傳檔案前,資料需要存放在某個位置。預設時,當上傳檔案小於2.5M時,django會將上傳檔案的全部內容讀進記憶體。意味著儲存檔案只有一次從記憶體讀取,一次寫磁碟。
但當上傳檔案很大時,django會把上傳檔案寫到臨時檔案中,然後存放到系統臨時檔案夾中。
三個設定控制django檔案上傳的行為:
FILE_UPLOAD_MAX_MEMORY_SIZE:直接讀入記憶體的最大上傳檔案大小(位元組數)。當大於此值時,檔案存放到磁碟。預設2.5M位元組
FILE_UPLOAD_TEMP_DIR
FILE_UPLOAD_PERMISSIONS:許可權
FILE_UPLOAD_HANDLERS
上傳檔案真正的處理器。修改此項設定可以完成自訂django上傳檔案的過程。
預設是:
("django.core.files.uploadhandler.MemoryFileUploadHandler","django.core.files.uploadhandler.TemporaryFileUploadHandler",)
先嘗試裝入記憶體,如不行就存入到臨時檔案。
實驗效果:
上傳前效果
上傳後效果