Django實(shí)現(xiàn)文件上傳下載
本文實(shí)例為大家分享了Django實(shí)現(xiàn)文件上傳下載的具體代碼,供大家參考,具體內(nèi)容如下
一、django實(shí)現(xiàn)文件下載
(1)、后臺接口
如果從服務(wù)器直接將文件路徑傳給瀏覽器,普通文件可以直接下載,而圖片,html,css和pdf格式等文件會直接顯示,所以解決辦法就是在頭文件中讓文件流寫入硬盤.
①、最簡單的文件下載功能的實(shí)現(xiàn),直接將文件流放入HttpResponse對象即可
def file_download(request):
# do something...
with open('file_name.txt') as f:
c = f.read()
return HttpResponse(c)
這種方式簡單粗暴,適合小文件的下載,但如果這個文件非常大,這種方式會占用大量的內(nèi)存,甚至導(dǎo)致服務(wù)器崩潰
②、更合理的文件下載
Django的HttpResponse對象運(yùn)行將迭代器作為傳入?yún)?shù),將上面代碼中的傳入?yún)?shù)c換成一個迭代器,便可以將上述下載功能優(yōu)化為對大小文件均適合;而Django更進(jìn)一步,推薦使用 StreamingHttpResponse對象取代HttpResponse對象,StreamingHttpResponse對象用于將文件流發(fā)送給瀏覽器,與HttpResponse對象非常相似,對于文件下載功能,使用StreamingHttpResponse對象更合理。因此,更加合理的文件下載功能,應(yīng)該先寫一個迭代器,用于處理文件,然后將這個迭代器作為參數(shù)傳遞給StreaminghttpResponse對象,如:
from django.http import StreamingHttpResponse
def big_file_download(request):
# do something...
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
the_file_name = "file_name.txt"
response = StreamingHttpResponse(file_iterator(the_file_name))
return response
③、再次優(yōu)化
上述的代碼,已經(jīng)完成了將服務(wù)器上的文件,通過文件流傳輸?shù)綖g覽器,但文件流通常會以亂碼形式顯示到瀏覽器中,而非下載到硬盤上,因此,還要在做點(diǎn)優(yōu)化,讓文件流寫入硬盤。優(yōu)化很簡單,給StreamingHttpResponse對象的Content-Type和Content-Disposition字段賦下面的值即可
from django.http import StreamingHttpResponse
def big_file_download(request):
# do something...
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
the_file_name = "big_file.pdf"
response = StreamingHttpResponse(file_iterator(the_file_name))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name)
return response
(2)、前臺展示
①、使用a標(biāo)簽直接訪問到上面的視圖函數(shù)配置好的url即可
②、使用button,或者其他標(biāo)簽
使用js觸發(fā)點(diǎn)擊事件,代碼如下:
$("body").on("click",".buttonimgdown",function(){
alert($(".hiddenshiyan").val());
location.href="/downloadFile/?url=" rel="external nofollow" +$(".hiddenshiyan").val();
});
二 文件上傳
(1)、前臺表單,使用表單的方式進(jìn)行文件的上傳
<form enctype="multipart/form-data" action="./upload" method="post"> <p>File: <input type="file" name="file"></p> <p><input type="submit" value="Upload"></p> </form>
(2)、后臺接收,這是接收圖片的代碼,其他文件類似
def addOnepicture(req): rollpicturePath=os.path.join(basePath,rollpictureName) reqfile = req.FILES['picfile'] img = Image.open(reqfile) img.thumbnail((500,500),Image.ANTIALIAS)#對圖片進(jìn)行等比縮放 img.save(rollpicturePath,"png")#保存圖片 T_Picture.objects.create(<u>...</u>)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python編程快速上手——strip()函數(shù)的正則表達(dá)式實(shí)現(xiàn)方法分析
這篇文章主要介紹了Python strip()函數(shù)的正則表達(dá)式實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python基于正則表達(dá)式實(shí)現(xiàn)strip()函數(shù)的方法,需要的朋友可以參考下2020-02-02
python飛機(jī)大戰(zhàn)pygame游戲之?dāng)硻C(jī)出場實(shí)現(xiàn)方法詳解
這篇文章主要介紹了python飛機(jī)大戰(zhàn)pygame游戲之?dāng)硻C(jī)出場實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Python使用pygame模塊實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲中敵機(jī)出場相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12
Python讀取xlsx文件報錯:xlrd.biffh.XLRDError:?Excel?xlsx?file;no
這篇文章主要給大家介紹了關(guān)于Python庫xlrd中的xlrd.open_workbook()函數(shù)讀取xlsx文件報錯:xlrd.biffh.XLRDError:?Excel?xlsx?file;not?supported問題解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
OpenCV-Python實(shí)現(xiàn)輪廓的特征值
輪廓自身的一些屬性特征及輪廓所包圍對象的特征對于描述圖像具有重要意義。本篇博文將介紹幾個輪廓自身的屬性特征及輪廓包圍對象的特征,感興趣的可以了解一下2021-06-06
Python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的示例代碼
夏天是用來告別的季節(jié),因?yàn)楫厴I(yè)總在七月。那么七月之前的季節(jié)是用來干嘛的呢?當(dāng)然是用來做畢業(yè)設(shè)計的啦!本文為大家準(zhǔn)備了兩個版本的學(xué)生信息管理系統(tǒng),希望對大家有所幫助2023-02-02
python代碼 if not x: 和 if x is not None: 和 if not x is None:使用
這篇文章主要介紹了python代碼 if not x: 和 if x is not None: 和 if not x is None:使用介紹,需要的朋友可以參考下2016-09-09

