Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)
利用Django實(shí)現(xiàn)文件上傳并且保存到指定路徑下,其實(shí)并不困難,完全不需要用到django的forms,也不需要django的models,就可以實(shí)現(xiàn),下面開始實(shí)現(xiàn)。
第一步:在模板文件中,創(chuàng)建一個(gè)form表單,需要特別注意的是,在有文件上傳的form表單中,method屬性必須為post,而且必須指定它的enctype為"multipart/form-data",表明不對(duì)字符進(jìn)行編碼,具體的代碼如下:
<form enctype="multipart/form-data" action="/uploadFile/" method="post"> <input type="file" name="myfile" /> <br/> <input type="submit" value="upload"/> </form>
第二步:設(shè)置urls.py文件,指定相應(yīng)的視圖函數(shù)進(jìn)行處理
第三步:最重要的,在視圖函數(shù)中做處理,先把代碼貼出來(lái),一共就這么點(diǎn),可以實(shí)現(xiàn)任何格式文件的上傳
def upload_file(request): if request.method == "POST": # 請(qǐng)求方法為POST時(shí),進(jìn)行處理 myFile =request.FILES.get("myfile", None) # 獲取上傳的文件,如果沒有文件,則默認(rèn)為None if not myFile: returnHttpResponse("no files for upload!") destination = open(os.path.join("E:\\upload",myFile.name),'wb+') # 打開特定的文件進(jìn)行二進(jìn)制的寫操作 for chunk in myFile.chunks(): # 分塊寫入文件 destination.write(chunk) destination.close() returnHttpResponse("upload over!")
代碼就是上面這些。
這里需要對(duì)上面視圖函數(shù)中的代碼進(jìn)行詳細(xì)的解釋一番:
首先,對(duì)于上傳的文件,雖然是通過(guò)POST的方式上傳的,但是不能通過(guò)request.POST["myfile"]或者request.POST.get("myfile", None),這兩種方式來(lái)訪問(wèn),這里需要使用另外一種方式,就是:
request.FILES["myfile"]或者request.FILES.get("myfile", None)
因?yàn)樯蟼鞯奈募潜4嬖贔ILES這個(gè)字典中的,可以在if request.method =="POST"之前加上一句assert False,再運(yùn)行瀏覽器,就可以看到結(jié)果。
接下來(lái),需要判斷用戶是不是真的上傳了文件,如果用戶僅僅只是點(diǎn)了 一下upload按鍵,那么就提示他沒有上傳文件。
下面是最重要的部分,現(xiàn)在已經(jīng)得到了文件了,但是文件在內(nèi)存中,沒有寫到硬盤里面去,接下里需要完成的就是把文件寫入到硬盤,那到底該怎么寫,我看了很多人的博客,寫的云里霧里的,都沒有說(shuō)清楚,把我搞糊涂了。
其實(shí)上傳文件,就是把硬盤里面某個(gè)文件的數(shù)據(jù),寫入到服務(wù)器指定的文件中,在最底層不管是txt文件還是exe文件等,全都是二進(jìn)制的數(shù)據(jù),這里所要做的只是將已經(jīng)上傳了的文件的數(shù)據(jù),以二進(jìn)制的方式寫入到服務(wù)器指定的文件中,這個(gè)文件可以隨意命名。
比如可以將上傳的123.exe文件,保存為abc.txt,但是這毫無(wú)意義,對(duì)于上傳的123.exe,在服務(wù)器上也應(yīng)該是123.exe。其實(shí)在這里所說(shuō)的abc.txt和123.exe的內(nèi)容是完全一樣的,只需要將abc.txt的文件后綴改為exe就行了。
在進(jìn)行進(jìn)一步的代碼解釋之前,需要先講幾個(gè)關(guān)于上傳文件的方法和屬性:
myFile.read():從文件中讀取整個(gè)上傳的數(shù)據(jù),這個(gè)方法只適合小文件;
myFile.chunks():按塊返回文件,通過(guò)在for循環(huán)中進(jìn)行迭代,可以將大文件按塊寫入到服務(wù)器中;
myFile.multiple_chunks():這個(gè)方法根據(jù)myFile的大小,返回True或者False,當(dāng)myFile文件大于2.5M(默認(rèn)為2.5M,可以調(diào)整)時(shí),該方法返回True,否則返回False,因此可以根據(jù)該方法來(lái)選擇選用read方法讀取還是采用chunks方法:
if myFile.multiple_chunks() == False: # 使用myFile.read() else: # 使用myFile.chunks()
myFile.name:這是一個(gè)屬性,不是方法,該屬性得到上傳的文件名,包括后綴,如123.exe;
myFile.size:這也是一個(gè)屬性,該屬性得到上傳文件的大小。
接下來(lái)的一行代碼是:
destination = open(os.path.join("E:\\upload",myFile.name), 'wb+')
這一行代碼需要用到os模塊,import os。對(duì)于os.path.join("E:\\upload", myFile.name),如果上傳的文件為123.exe,那么將得到E:\\upload\\123.exe這個(gè)路徑,以寫二進(jìn)制的方式打開這個(gè)文件。接下來(lái)是分塊寫入數(shù)據(jù):
for chunk in myFile.chunks(): # 分塊寫入文件 destination.write(chunk)
數(shù)據(jù)寫完之后關(guān)閉文件就可以了,destination.close()。
首先選擇文件:
點(diǎn)擊upload,顯示upload over!
查看指定目錄下是否有相應(yīng)的上傳文件:
到此這篇關(guān)于Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)的文章就介紹到這了,更多相關(guān)Django 任意文件上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Django 如何實(shí)現(xiàn)文件上傳下載
- Django和Ueditor自定義存儲(chǔ)上傳文件的文件名
- 詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式
- 基于django和dropzone.js實(shí)現(xiàn)上傳文件
- python中Django文件上傳方法詳解
- Django后端分離 使用element-ui文件上傳方式
- Django Admin 上傳文件到七牛云的示例代碼
- Django 解決上傳文件時(shí),request.FILES為空的問(wèn)題
- Django中文件上傳和文件訪問(wèn)微項(xiàng)目的方法
- django 文件上傳功能的相關(guān)實(shí)例代碼(簡(jiǎn)單易懂)
- django上傳文件的三種方式
相關(guān)文章
解決pycharm 格式報(bào)錯(cuò)tabs和space不一致問(wèn)題
這篇文章主要介紹了解決pycharm 格式報(bào)錯(cuò)tabs和space不一致問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Python能干什么、Python主要應(yīng)用于哪些方面
無(wú)論是從入門級(jí)選手到專業(yè)級(jí)選手都在做的爬蟲,還是Web程序開發(fā)、桌面程序開發(fā)還是科學(xué)計(jì)算、圖像處理, Python都可以勝任。Python為我們提供了非常完善的基礎(chǔ)代碼庫(kù),覆蓋了網(wǎng)絡(luò)、文件、GUI、 數(shù)據(jù)庫(kù)、文本等大量?jī)?nèi)容。用Python開發(fā),許多功能不必從零編寫2023-06-06python使用wmi模塊獲取windows下硬盤信息的方法
這篇文章主要介紹了python使用wmi模塊獲取windows下硬盤信息的方法,涉及Python獲取系統(tǒng)硬件信息的相關(guān)技巧,需要的朋友可以參考下2015-05-05Python 列表中的修改、添加和刪除元素的實(shí)現(xiàn)
這篇文章主要介紹了Python 列表中的修改、添加和刪除元素的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06PyCharm使用Docker鏡像搭建Python開發(fā)環(huán)境
這篇文章主要介紹了PyCharm使用Docker鏡像搭建Python開發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Python3實(shí)現(xiàn)建造者模式的示例代碼
這篇文章主要介紹了Python3 實(shí)現(xiàn)建造者模式的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Python+Pygame實(shí)戰(zhàn)之炫舞小游戲的實(shí)現(xiàn)
提到QQ炫舞,可能很多人想到的第一個(gè)詞是“青春”?;腥婚g,這個(gè)承載了無(wú)數(shù)人回憶與時(shí)光的游戲品牌,已經(jīng)走到了第十幾個(gè)年頭。今天小編就來(lái)給大家嘗試做一款簡(jiǎn)單的簡(jiǎn)陋版的小游戲——《舞動(dòng)青春*炫舞》,感興趣的可以了解一下2022-12-12