我們?cè)?a target="_blank">學(xué)習(xí)django 時(shí),會(huì)經(jīng)常遇到上傳文件的時(shí)候,這里筆者就給大家寫一個(gè)簡(jiǎn)單的教程。
1 template模版文件uploadfile.html
特別注意的是,只有當(dāng)request方法是POST,且發(fā)送request的<form>有屬性enctype="multipart/form-data"時(shí),request.FILES中包含文件數(shù)據(jù),否則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 視圖函數(shù)
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');
此處說(shuō)明:將上傳的文件存放在工程目錄下的static/jpg/目錄下,文件名就是上傳的文件名,只是實(shí)驗(yàn)性的所以沒有加錯(cuò)誤驗(yàn)證,如果用于生產(chǎn)環(huán)境,需要嚴(yán)格驗(yàn)證,比如文件是否存在、讀寫錯(cuò)誤等。
上傳的文件在request.FILES,是一個(gè)近似字典類型的數(shù)據(jù)類型,擁有基本的4個(gè)基本屬性,name文件名/size文件大小(以字節(jié)為單位)/content_type文件類型/read文件內(nèi)容
擁有的方法chunks()返回一個(gè)上傳文件的分塊生成器,有一個(gè)可選參數(shù)是設(shè)置每次讀取的字節(jié)數(shù)。如果上傳的文件很大,使用這個(gè)方法可以節(jié)省內(nèi)存,不會(huì)一下子占用大量?jī)?nèi)存空間。
上傳文件保存的位置
保存上傳文件前,數(shù)據(jù)需要存放在某個(gè)位置。默認(rèn)時(shí),當(dāng)上傳文件小于2.5M時(shí),django會(huì)將上傳文件的全部?jī)?nèi)容讀進(jìn)內(nèi)存。意味著保存文件只有一次從內(nèi)存讀取,一次寫磁盤。
但當(dāng)上傳文件很大時(shí),django會(huì)把上傳文件寫到臨時(shí)文件中,然后存放到系統(tǒng)臨時(shí)文件夾中。
三個(gè)設(shè)置控制django文件上傳的行為:
FILE_UPLOAD_MAX_MEMORY_SIZE:直接讀入內(nèi)存的最大上傳文件大小(字節(jié)數(shù))。當(dāng)大于此值時(shí),文件存放到磁盤。默認(rèn)2.5M字節(jié)
FILE_UPLOAD_TEMP_DIR
FILE_UPLOAD_PERMISSIONS:權(quán)限
FILE_UPLOAD_HANDLERS
上傳文件真正的處理器。修改此項(xiàng)設(shè)置可以完成自定義django上傳文件的過(guò)程。
默認(rèn)是:
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)
先嘗試裝入內(nèi)存,如不行就存入到臨時(shí)文件。
實(shí)驗(yàn)效果:
上傳前效果
上傳后效果
原文來(lái)自:博客園