1. 程式人生 > 程式設計 >Django實現檔案上傳下載

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>)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。