1 template模版文件uploadfile.html 特別註意的是,只有當request方法是POST,且發送request的<form>有屬性enctype="multipart/form-data"時,request.FILES中包含文件數據,否則request.FILES為空。 2 視圖 ...
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",)
先嘗試裝入記憶體,如不行就存入到臨時文件。
實驗效果:
上傳前效果
上傳後效果