1. 程式人生 > 程式設計 >Django實現任意檔案上傳(最簡單的方法)

Django實現任意檔案上傳(最簡單的方法)

利用Django實現檔案上傳並且儲存到指定路徑下,其實並不困難,完全不需要用到django的forms,也不需要django的models,就可以實現,下面開始實現。

第一步:在模板檔案中,建立一個form表單,需要特別注意的是,在有檔案上傳的form表單中,method屬性必須為post,而且必須指定它的enctype為"multipart/form-data",表明不對字元進行編碼,具體的程式碼如下:

<form enctype="multipart/form-data" action="/uploadFile/" method="post">
  <input type="file" name="myfile" />
  <br/>
  <input type="submit" value="upload"/>
</form>

Django實現任意檔案上傳(最簡單的方法)

第二步:設定urls.py檔案,指定相應的檢視函式進行處理

第三步:最重要的,在檢視函式中做處理,先把程式碼貼出來,一共就這麼點,可以實現任何格式檔案的上傳

def upload_file(request): 
  if request.method == "POST":  # 請求方法為POST時,進行處理 
    myFile =request.FILES.get("myfile",None)  # 獲取上傳的檔案,如果沒有檔案,則預設為None 
    if not myFile: 
      returnHttpResponse("no files for upload!") 
    destination = open(os.path.join("E:\\upload",myFile.name),'wb+')  # 開啟特定的檔案進行二進位制的寫操作 
    for chunk in myFile.chunks():   # 分塊寫入檔案 
      destination.write(chunk) 
    destination.close() 
    returnHttpResponse("upload over!") 

程式碼就是上面這些。

這裡需要對上面檢視函式中的程式碼進行詳細的解釋一番:

首先,對於上傳的檔案,雖然是通過POST的方式上傳的,但是不能通過request.POST["myfile"]或者request.POST.get("myfile",None),這兩種方式來訪問,這裡需要使用另外一種方式,就是:

request.FILES["myfile"]或者request.FILES.get("myfile",None)

因為上傳的檔案是儲存在FILES這個字典中的,可以在if request.method =="POST"之前加上一句assert False,再執行瀏覽器,就可以看到結果。

Django實現任意檔案上傳(最簡單的方法)

接下來,需要判斷使用者是不是真的上傳了檔案,如果使用者僅僅只是點了 一下upload按鍵,那麼就提示他沒有上傳檔案。

下面是最重要的部分,現在已經得到了檔案了,但是檔案在記憶體中,沒有寫到硬盤裡面去,接下里需要完成的就是把檔案寫入到硬碟,那到底該怎麼寫,我看了很多人的部落格,寫的雲裡霧裡的,都沒有說清楚,把我搞糊塗了。

其實上傳檔案,就是把硬盤裡面某個檔案的資料,寫入到伺服器指定的檔案中,在最底層不管是txt檔案還是exe檔案等,全都是二進位制的資料,這裡所要做的只是將已經上傳了的檔案的資料,以二進位制的方式寫入到伺服器指定的檔案中,這個檔案可以隨意命名。

比如可以將上傳的123.exe檔案,儲存為abc.txt,但是這毫無意義,對於上傳的123.exe,在伺服器上也應該是123.exe。其實在這裡所說的abc.txt和123.exe的內容是完全一樣的,只需要將abc.txt的檔案字尾改為exe就行了。

在進行進一步的程式碼解釋之前,需要先講幾個關於上傳檔案的方法和屬性:

myFile.read():從檔案中讀取整個上傳的資料,這個方法只適合小檔案;

myFile.chunks():按塊返回檔案,通過在for迴圈中進行迭代,可以將大檔案按塊寫入到伺服器中;

myFile.multiple_chunks():這個方法根據myFile的大小,返回True或者False,當myFile檔案大於2.5M(預設為2.5M,可以調整)時,該方法返回True,否則返回False,因此可以根據該方法來選擇選用read方法讀取還是採用chunks方法:

if myFile.multiple_chunks() == False:
  # 使用myFile.read()
 else:
  # 使用myFile.chunks()

myFile.name:這是一個屬性,不是方法,該屬性得到上傳的檔名,包括字尾,如123.exe;

myFile.size:這也是一個屬性,該屬性得到上傳檔案的大小。

接下來的一行程式碼是:

destination = open(os.path.join("E:\\upload",'wb+')

這一行程式碼需要用到os模組,import os。對於os.path.join("E:\\upload",myFile.name),如果上傳的檔案為123.exe,那麼將得到E:\\upload\\123.exe這個路徑,以寫二進位制的方式開啟這個檔案。接下來是分塊寫入資料:

for chunk in myFile.chunks():   # 分塊寫入檔案
 
  destination.write(chunk)

資料寫完之後關閉檔案就可以了,destination.close()。

首先選擇檔案:

Django實現任意檔案上傳(最簡單的方法)

點選upload,顯示upload over!

檢視指定目錄下是否有相應的上傳檔案:

Django實現任意檔案上傳(最簡單的方法)

到此這篇關於Django實現任意檔案上傳(最簡單的方法)的文章就介紹到這了,更多相關Django 任意檔案上傳內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!