亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)

瀏覽:102日期:2024-09-29 15:33:30

利用Django實(shí)現(xiàn)文件上傳并且保存到指定路徑下,其實(shí)并不困難,完全不需要用到django的forms,也不需要django的models,就可以實(shí)現(xiàn),下面開(kāi)始實(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>

Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)

第二步:設(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) # 獲取上傳的文件,如果沒(méi)有文件,則默認(rèn)為None if not myFile: returnHttpResponse('no files for upload!') destination = open(os.path.join('E:upload',myFile.name),’wb+’) # 打開(kāi)特定的文件進(jìn)行二進(jìn)制的寫(xiě)操作 for chunk in myFile.chunks(): # 分塊寫(xiě)入文件 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é)果。

Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)

接下來(lái),需要判斷用戶是不是真的上傳了文件,如果用戶僅僅只是點(diǎn)了 一下upload按鍵,那么就提示他沒(méi)有上傳文件。

下面是最重要的部分,現(xiàn)在已經(jīng)得到了文件了,但是文件在內(nèi)存中,沒(méi)有寫(xiě)到硬盤(pán)里面去,接下里需要完成的就是把文件寫(xiě)入到硬盤(pán),那到底該怎么寫(xiě),我看了很多人的博客,寫(xiě)的云里霧里的,都沒(méi)有說(shuō)清楚,把我搞糊涂了。

其實(shí)上傳文件,就是把硬盤(pán)里面某個(gè)文件的數(shù)據(jù),寫(xiě)入到服務(wù)器指定的文件中,在最底層不管是txt文件還是exe文件等,全都是二進(jìn)制的數(shù)據(jù),這里所要做的只是將已經(jīng)上傳了的文件的數(shù)據(jù),以二進(jìn)制的方式寫(xiě)入到服務(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)行迭代,可以將大文件按塊寫(xiě)入到服務(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:upload123.exe這個(gè)路徑,以寫(xiě)二進(jìn)制的方式打開(kāi)這個(gè)文件。接下來(lái)是分塊寫(xiě)入數(shù)據(jù):

for chunk in myFile.chunks(): # 分塊寫(xiě)入文件 destination.write(chunk)

數(shù)據(jù)寫(xiě)完之后關(guān)閉文件就可以了,destination.close()。

首先選擇文件:

Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)

點(diǎn)擊upload,顯示upload over!

查看指定目錄下是否有相應(yīng)的上傳文件:

Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)

到此這篇關(guān)于Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)的文章就介紹到這了,更多相關(guān)Django 任意文件上傳內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 婷婷在线网站 | 一级毛毛片毛片毛片毛片在线看 | 国产黄色大片网站 | 动漫精品专区一区二区三区不卡 | 99av在线| 亚洲爱爱图片 | 国产精品卡哇伊小可爱在线观看 | 亚洲国产精品成人久久 | 中文字幕第13亚洲另类 | 亚洲女初尝黑人巨高清在线观看 | qvod激情视频在线观看 | 丰满多水的寡妇毛片免费看 | 欧美黑寡妇香蕉视频 | 瑟瑟久久 | 美女美女高清毛片视频 | 国产三级毛片 | 成人精品综合免费视频 | 国产女人一区二区 | 在线播放黄 | 亚洲色图视频在线 | 亚洲精品国产第一区二区图片 | 性爽交免费视频 | 搞黄视频免费 | 999热这里只有精品 999热精品这里在线观看 | 99久久国语露脸精品对白 | 成人国产三级在线播放 | 白丝啪啪 | 国产一区二区三区免费观看 | 欧美一级毛片国产一级毛片 | 正在播放国产精品白丝在线 | 黄色资源在线 | 亚洲欧洲日韩在线 | 免费大片在线观看 | 极品精品国产超清自在线观看 | 国产91欧美 | 日韩精品你懂的在线播放 | 在线观看a级片 | 日本一级特黄大一片免 | 国产在线视频网站 | 亚洲永久精品免费www52zcm男男 | 国产精品资源在线播放 |