django 檔案上傳

2021-05-22 01:40:04 字數 2869 閱讀 2876

檔案上傳

當django處理上傳乙個檔案的時候,檔案資料被放在request.files中。這個文件解釋檔案怎麼樣被儲存在磁碟上或者記憶體中,怎樣定製預設的行為。

基本檔案上傳

考慮乙個包含filefield的簡單的表單:

from

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異常,上傳將被放棄或者檔案被完全跳過。

fileuploadhandler.file_complete(self,

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...