利用Django實現文件上傳而且保存到指定路徑下,其實並不困難,徹底不須要用到django的forms,也不須要django的models,就能夠實現,下面開始實現。html
第一步:在模板文件中,建立一個form表單,須要特別注意的是,在有文件上傳的form表單中,method屬性必須爲post,並且必須指定它的enctype爲"multipart/form-data",代表不對字符進行編碼,具體的代碼以下:python
第二步:設置urls.py文件,指定相應的視圖函數進行處理django
第三步:最重要的,在視圖函數中作處理,先把代碼貼出來,一共就這麼點,能夠實現任何格式文件的上傳瀏覽器
1
2
3
4
5
6
7
8
9
10
|
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!"
)
|
代碼就是上面這些。服務器
這裏須要對上面視圖函數中的代碼進行詳細的解釋一番:app
首先,對於上傳的文件,雖然是經過POST的方式上傳的,可是不能經過request.POST["myfile"]或者request.POST.get("myfile", None),這兩種方式來訪問,這裏須要使用另一種方式,就是:函數
request.FILES["myfile"]或者request.FILES.get("myfile", None)post
由於上傳的文件是保存在FILES這個字典中的,能夠在if request.method =="POST"以前加上一句assert False,再運行瀏覽器,就能夠看到結果。網站
接下來,須要判斷用戶是否是真的上傳了文件,若是用戶僅僅只是點了 一下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方法:
1
2
3
4
5
6
7
|
if
myFile.multiple_chunks()
=
=
False
:
# 使用myFile.read()
else
:
# 使用myFile.chunks()
|
myFile.name:這是一個屬性,不是方法,該屬性獲得上傳的文件名,包括後綴,如123.exe;
myFile.size:這也是一個屬性,該屬性獲得上傳文件的大小。
接下來的一行代碼是:
1
|
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這個路徑,以寫二進制的方式打開這個文件。接下來是分塊寫入數據:
1
2
3
|
for
chunk
in
myFile.chunks():
# 分塊寫入文件
destination.write(chunk)
|
數據寫完以後關閉文件就能夠了,destination.close()。
首先選擇文件:
點擊upload,顯示upload over!
查看指定目錄下是否有相應的上傳文件:
補充:
轉載自https://www.cnblogs.com/huchong/p/7910131.html#navigator
urlpatterns = [
url(r'^$', app1_views.index), #網站頁面
url(r'^uploadFile/$', app1_views.upload_file), #上傳函數
url(r'^admin/', admin.site.urls),
]