Django實現檔案上傳下載
本文例項為大家分享了Django實現檔案上傳下載的具體程式碼,供大家參考,具體內容如下
一、django實現檔案下載
(1)、後臺介面
如果從伺服器直接將檔案路徑傳給瀏覽器,普通檔案可以直接下載,而圖片,html,css和pdf格式等檔案會直接顯示,所以解決辦法就是在標頭檔案中讓檔案流寫入硬碟.
①、最簡單的檔案下載功能的實現,直接將檔案流放入HttpResponse物件即可
def file_download(request): # do something... with open('file_name.txt') as f: c = f.read() return HttpResponse(c)
這種方式簡單粗暴,適合小檔案的下載,但如果這個檔案非常大,這種方式會佔用大量的記憶體,甚至導致伺服器崩潰
②、更合理的檔案下載
Django的HttpResponse物件執行將迭代器作為傳入引數,將上面程式碼中的傳入引數c換成一個迭代器,便可以將上述下載功能優化為對大小檔案均適合;而Django更進一步,推薦使用 StreamingHttpResponse物件取代HttpResponse物件,StreamingHttpResponse物件用於將檔案流傳送給瀏覽器,與HttpResponse物件非常相似,對於檔案下載功能,使用StreamingHttpResponse物件更合理。因此,更加合理的檔案下載功能,應該先寫一個迭代器,用於處理檔案,然後將這個迭代器作為引數傳遞給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
③、再次優化
上述的程式碼,已經完成了將伺服器上的檔案,通過檔案流傳輸到瀏覽器,但檔案流通常會以亂碼形式顯示到瀏覽器中,而非下載到硬碟上,因此,還要在做點優化,讓檔案流寫入硬碟。優化很簡單,給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標籤直接訪問到上面的檢視函式配置好的url即可
②、使用button,或者其他標籤
使用js觸發點選事件,程式碼如下:
$("body").on("click",".buttonimgdown",function(){ alert($(".hiddenshiyan").val()); location.href="/downloadFile/?url=" rel="external nofollow" +$(".hiddenshiyan").val(); });
二 檔案上傳
(1)、前臺表單,使用表單的方式進行檔案的上傳
<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)#對圖片進行等比縮放 img.save(rollpicturePath,"png")#儲存圖片 T_Picture.objects.create(<u>...</u>)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。