1. 程式人生 > >django 20、上傳檔案原理解析

django 20、上傳檔案原理解析

最近還是被django的上傳大檔案搞得暈頭轉向,轉而看了這方面的原理,把自己的心得寫了出來。

首先,我想說:如果你使用的是django預設的FileField的形式通過表單上傳,那麼其實你完全不需要管理如何上傳,或者自己去寫一個分塊讀取寫入的函式,

這個是django已經幫你做完了。

表單接收到的上傳檔案資料在還沒有被我們完全接收時,資料存放在哪裡?

1預設,上傳檔案<2.5M,Django放在記憶體裡

2大檔案,會將檔案寫入到臨時檔案中

這個檔案在臨時檔案路徑中,上傳完畢,將呼叫View中的

_Upload()方法將臨時資料夾中的臨時檔案

分塊寫到上傳檔案的存放路徑下,每塊的大小為64K,寫完後臨時

檔案將被刪除。

注意第二點:django已經實現了把大檔案拆分成塊幫你讀取,並實現上傳,因此即使你存在大檔案上傳,速度比較慢,並不要緊,django已經幫你處理了。

瞭解到這裡,我依然會把其他原理部分講解一下:

headImg =request.FILES["headImg"]

request.FILES:檔案怎麼被儲存在磁碟上或者內icunzhong

一個處理表單的檢視將在request.FILES中接受檔案資料,它是字典。

可以通過request.FILES[“file”]鍵來訪問

uf = UploadFileForm(request.POST,request.FILES)

注意我們必須將request.FILES傳遞到表單的構造器中

這就是檔案資料怎麼和表單關聯的。

處理上傳的檔案:

難點在於處理從request.FILES中獲得的真實檔案。

這個字典的每個輸入都是UploadedFile物件(上傳之後的檔案的簡單包裝)

UploadedFile.read():從檔案中讀取整個上傳的資料

UploadedFile.multiple_chunks():如果上傳的檔案足夠大,需要分塊就返回為真。預設為2.5M

UploadedFile.chunks() :產生器,返回檔案的塊

UploadedFile.name:上傳檔案的名字(不含字首路徑)

UploadedFile.size:以位元表示的上傳檔案的大小

因此,我們不需要對上上傳做處理。

網上看到有人這樣對上傳檔案處理:

def handle_uploaded_file(f):
    destination = open('some/file/name.txt','wb+')
    for chunk in f.chunks(): 
        destination.write(chunk)
    destination.close()


完全沒有必要,你做的django已經幫你做了,除非你自己需要對上傳檔案做特殊處理。

相關推薦

django 20檔案原理解析

最近還是被django的上傳大檔案搞得暈頭轉向,轉而看了這方面的原理,把自己的心得寫了出來。 首先,我想說:如果你使用的是django預設的FileField的形式通過表單上傳,那麼其實你完全不需要管理如何上傳,或者自己去寫一個分塊讀取寫入的函式, 這個是django已經

Django 使用ajax檔案

Django 使用ajax上傳檔案 JSON json指的是JavaScript物件表示法(JavaScript Object Notaion) json是輕量級的文字資料交換格式 json獨立於語言 json具有自我描述性,更易理解 JSON 使用 JavaScript 語法來描述資料物件,但是

36檔案

學習目標: 1、掌握檔案上傳的方法 2、為什麼要學習Java語言 學習過程: 這節課講解一些如何上傳檔案,這裡我們為使用者表新增一個頭像屬性 一、修改資料庫表 首先我們要儲存使用者上傳檔案的資訊,所有要修改資料庫,但是我們不是使用資料庫儲存檔案的,檔案儲存在web伺服器的目錄

spring框架檔案原理探究

    <bean id="multipartResolver"           class="org.springframework.web.multipart.commons.CommonsMultipartRe

javaSE (四十)網路程式設計(TCP傳輸伺服器多執行緒網路程式設計練習:反轉字串檔案

1、TCP傳輸: 1.客戶端 建立Socket連結服務端(指定ip地址,埠號),通過ip地址找到對應的伺服器 呼叫Socket的getInputStream和getOutputStream方法獲取和伺服器端相連的IO流 2.伺服器端 建立Se

GitHub網頁使用技巧——新建倉庫檔案建立新資料夾圖片

GitHub網頁使用技巧 I、新建倉庫、不用遠端上傳檔案,直接本地上傳: 建立一個名為X的新倉庫,直接網頁上粘程式碼,不用遠端上傳檔案。 New Repository -> Repository

WordPress安裝主題失敗檔案失敗問題解決辦法

因為阿里雲伺服器總是提示某個網站有木馬,而且這個網站很low,所以刪除原來的原始碼,重新安裝下。但是安裝後無法更新主題,用了在CSDN上看到的方法,直接在WordPress官網上下載主題,然後上傳到伺服器的方法,但是上傳檔案又會出問題。 其實看:https://blog.csdn.net/q

教你如何呼叫百度編輯器ueditor的圖片檔案等模組

出於興趣愛好,前段時間自己嘗試寫了一個叫simple的cms,裡面使用了百度ueditor編輯器,發現它的多圖片上傳模組很不錯,用起來很方便,又可以選擇已經上傳好的圖片。正好我又是個懶人,發現有現成的自己就不想新開發了。於是我就想,是不是可以呼叫這個上傳模板為自己所用呢?

django ImageField,FileField,檔案,命名問題

django 的models.ImageFiled,FileField有屬性upload_to,該屬性是指定將檔案上傳到伺服器的位置,及儲存在哪個資料夾下,你可以很方便甚至很少的程式碼就可以實現檔案上傳操作了。但是預設的儲存的檔名是沒有改變的,也就是說所儲存的檔名就是你上傳時

使用HttpURLConnection請求資料檔案圖片等

NetWorkUtils.java import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.PixelFormat; import android.

檔案漏洞&解析漏洞

本文致力於探索利用網站漏洞來上傳非法檔案的方法。 基本技術 下面是一些繞過檔案上傳限制的基本技術。其中的漏洞與網站使用的後臺無關,而是由於網頁的編寫者沒有進行完全和有效的限制才產生的漏洞。 型別1:前端驗證 某些網站採用前端驗證的方式限制使用者上

Django檔案(.txt .php .py .jpg .pdf .doc所有型別的檔案原理都一樣)基本原理

1、上傳檔案基本原理: ①、index.html檔案如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>檔案上傳頁<

Django檔案原理

1. 當Django在處理檔案上傳的時候,檔案資料被儲存在request.FILES。當用戶上傳一個檔案的時候,Django會把檔案資料傳遞給上傳處理器,一個小型的類,會在檔案資料上傳時處理它。上傳處理器在FILE_UPLOAD_HANDLERS中定義,預設為:("djan

51. 檔案篇——IIS解析漏洞原理

目錄解析當建立“*asp、*asa”格式的資料夾時,其目錄下的任意檔案都將會被IIS當做ASP檔案來解析。例如:建立資料夾parsing.asp,在parsing.asp資料夾下新建一個文字檔案test.txt,其內容為<%=now()%>,然後在瀏覽器中訪問,會

[Python] Django框架入門5——靜態文件中間件圖片和分頁

manage input 上傳文件 數據分頁 提交 family 數據 3.5 func 說明:   本文主要描述Django其他的內容,涉及靜態文件處理、中間件、上傳文件、分頁等。   開發環境:win10、Python3.5、Django1.10。    一、靜態文件處

springMVC檔案,MultipartHttpServletRequestMultipartFile進行檔案

這裡使用apache的開源jar包完成上傳功能,使用jar包分別是:common-fileupload.jar和common-io.jar  先編寫上傳檔案幫助類,如果需要區分檔案型別,可以將檔案字尾擷取進行判斷; springmvc-mvc.xml配置,這裡主要配置spri

Django檔案

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body&g

layui檔案圖片

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>layui</title> <meta name="renderer" content="

Android與與伺服器交換資料下載讀取檔案

一些變數的定義: //需要將下面的IP改為伺服器端IP private String txtUrl = "http://192.168.1.46:8080/AppServer/SynTxtDataServlet"; private String url = "http://192.

Java且後臺解析XML檔案

後臺程式碼: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import javax.