檔案上傳
當django處理上傳乙個檔案的時候,檔案資料被放在request.files中。這個文件解釋檔案怎麼樣被儲存在磁碟上或者記憶體中,怎樣定製預設的行為。
基本檔案上傳
考慮乙個包含filefield的簡單的表單:
fromfileuploadhandler.file_complete(self,django
import
forms
class
uploadfileform
(forms
.form
):title
=forms
.charfield
(max_length=50
)file
=forms
.filefield
()"django.core.files.uploadhandler.memoryfileuploadhandler"
,"django.core.files.uploadhandler.temporaryfileuploadhandler"
,)uploadedfile 物件
class uploadedfile
作為那些重file繼承的補充,素有的uploadedfile物件定義了下面的方法和屬性:
uploadedfile.content_type
檔案的content_type頭(比如text/plain
)。像使用者提供的任何資料一樣,你不應該信任上傳的資料就是這個型別。你仍然要驗證這個檔案包含這個頭宣告的content-type——「信任但是驗證」。
uploadedfile.charset
對於text/*的content-types,瀏覽器提供的字符集。再次,「信任但是驗證」是最好的策略。
uploadedfile.temporary_file_path():只有被傳到磁碟上的檔案才有這個方法,它返回臨時上傳檔案的全路徑。
注意:像通常的python檔案,你可以迭代上傳的檔案來一行一行得讀取檔案:
for line in uploadedfile:
do_something_with(line)
然而,不同於標準python檔案,uploadedfile值懂得/n(也被稱為unix風格)的結尾。如果你知道你需要處理有不同風格結尾的檔案的時候,你要在你的檢視中作出處理。
上傳處理控制代碼:
當乙個使用者上傳乙個檔案,django敬愛那個這個檔案資料傳遞給上傳處理控制代碼——乙個處理隨著檔案上傳處理檔案的小類。上傳處理控制代碼被file_upload_handlers初始化定義,預設是:
("django.core.files.uploadhandler.memoryfileuploadhandler"
,"django.core.files.uploadhandler.temporaryfileuploadhandler"
,)這兩個提供了django處理小檔案和大檔案的預設上產行為。
你可以個性化處理控制代碼來個性化django處理檔案的行為。比如你可以使用個性化的處理控制代碼來強制使用者配額,實時地壓縮資料,渲染進度條,甚至在儲存在本地的同時向另乙個儲存地傳送資料。
實時修改上傳處理控制代碼
有的時候某些檢視要使用不同的上傳行為。這種情況下,你可以重寫乙個上傳處理控制代碼,通過request.upload_handlers來修改。預設的,這個列表包含file_upload_handlers提供的處理控制代碼,但是你可以像修改其他列表一樣修改這個列表。
比如,加入你寫了乙個叫做
progressbaruploadhandler
的處理控制代碼。你可以通過下面的形式加到你的上傳處理控制代碼中:
request.upload_handlers.insert(0,progressbaruploadhandler
())你贏使用list.insert()在這種情況下。因為進度條處理控制代碼需要首先執行。記住,處理控制代碼按照順序執行。
如果你像完全代替掉上傳處理控制代碼,你可以賦值乙個新的列表:
request
.upload_handlers=[
progressbaruploadhandler
()]注意:你只能在訪問request.post或者request.files之前修改上傳處理控制代碼。——如果上傳處理開始後再改就沒用了。如果你在修改reqeust.uplaod_handlers之前訪問了request.post
or request.files
,django將丟擲乙個錯誤。
所以,在你的檢視中盡早的修改上傳處理控制代碼。
寫自定義的上傳處理控制代碼:
所有的上傳處理控制代碼都應 是 django.core.files.uploadhandler.fileuploadhandler的子類。你可以在任何你需要的地方定義控制代碼。
需要的方法:
自定義的上傳處理控制代碼必須定義一下的方法:
fileuploadhandler.receive_data_chunk(self,raw_data,start):從檔案上傳中接收塊。
raw_data是已經上傳的位元組流
start是raw_data塊開始的位置
你返回的資料將被傳遞到下乙個處理控制代碼的receive_data_chunk方法中。這樣乙個處理控制代碼就是另乙個的過濾器了。
返回none將阻止後面的處理控制代碼獲得這個塊,當你 自己儲存這個資料,而不想其他處理控制代碼儲存拷貝時很有用。
如果你觸發乙個stopupload或者skipfile異常,上傳將被放棄或者檔案被完全跳過。
file_size)
當 檔案上傳完畢時呼叫。
處理控制代碼應該返回乙個uploadfile物件,可以儲存在request.files中。處理控制代碼也可以返回none來使得uploadfile物件應該來自後來的上傳處理控制代碼。
剩下的就是可選的一些方法實現。
django 檔案上傳
檔案上傳 當django處理上傳乙個檔案的時候,檔案資料被放在request.files中。這個文件解釋檔案怎麼樣被儲存在磁碟上或者記憶體中,怎樣定製預設的行為。基本檔案上傳 考慮乙個包含filefield的簡單的表單 from django import forms class uploadfil...
Django檔案上傳
lang en charset utf 8 titletitle head action home method post enctype multipart form data type file name file type submit value 提交 p form div body htm...
django上傳檔案
template html 模板檔案 有如下乙個form from django import forms class uploadfileform forms.form title forms.charfield max length 50 file forms.filefield 處 理這個fo...