中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django實現任意文件上傳的方法

發布時間:2020-07-18 16:20:05 來源:億速云 閱讀:270 作者:小豬 欄目:開發技術

這篇文章主要講解了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",myFile.name), '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 任意文件上傳內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!

看完上述內容,是不是對Django實現任意文件上傳的方法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绍兴市| 葫芦岛市| 浦东新区| 商丘市| 福鼎市| 金乡县| 开平市| 满城县| 宣汉县| 屏东县| 兴城市| 峨边| 阳谷县| 潞城市| 渑池县| 宣威市| 商都县| 宝山区| 苍梧县| 泾阳县| 东乡| 环江| 凤山市| 镇巴县| 通渭县| 玛沁县| 名山县| 泽普县| 桂东县| 汾西县| 高陵县| 田林县| 新巴尔虎右旗| 霸州市| 若尔盖县| 肇庆市| 新宾| 太康县| 乌苏市| 东乡县| 马龙县|