亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Django文件上傳機制詳解

2019-11-11 06:21:34
字體:
來源:轉載
供稿:網友

文件上傳

    當Django處理上傳一個文件的時候,文件數據被放在request.FILES中。這個文檔解釋文件怎么樣被存儲在磁盤上或者內存中,怎樣定制默認的行為?;疚募蟼骺紤]一個包含FileField的簡單的表單:from  django  import  formsclassUploadFileForm(forms.Form):   title=forms.CharField(max_length=50)   file=forms.FileField()一個處理這個表單的視圖將在request.FILES中接受文件數據 ,request.FILES是一個字典,它對每個FileField(或者是ImageField,或者是其他的FileField的子類)都包含一個key.所以 從上面的表單中來的數據將可以通過request.FILES['file']鍵來訪問.注意request.FILES只有 在request方法是POST并且發出POST請求的

有屬性enctype="multipart/form-data".否則,request。FILES將是空的??戳硪粋€簡單的;from fdjango.http imPRot HttpResponseRedirectfrom django.shortcuts import render_to_responsefrom somewhere import handle_uploaded_filedef upload_file(request):    if request.method == 'post':        form =  UploadFileForm(rquest.POST,request.FILES)        if form.is_valid():            handle_uploaded_file(request.FILES['file'])            return HttpResponseRedirect('/success/ur/')   else:        form = UploadFileForm()    return render_to_response('upload.html',{'form':form})要注意,我們必須將request.FILES傳遞到表單的構造器中;這就是文件數據怎樣和表單沾上邊的 。處理上傳的文件最后的難題是怎樣處理從request.FILES中獲得的真實的文件。這個字典的每個輸入都是一個UploadedFile對象——一個上傳之后的文件的簡單的包裝。你通常會使用下面的幾個方法來訪問被上傳的內容:UploadedFile.read():從文件中讀取整個上傳的數據。小心整個方法:如果這個文件很大,你把它讀到內存中會弄慢你的系統。你可以想要使用chunks()來代替,看下面;UploadedFile.multiple_chunks():如果上傳的文件足夠大需要分塊就返回真。默認的這個值是2.5兆,當然這個值是可以調節的,看下面的UploadedFile.chunks():一個產生器,返回文件的塊。如果multiple_chunks()是真的話,你應該在一個循環中使用這個方法,而不是使用read();UploadedFile.name:上傳文件的名字(比如m_file.txt)UploadedFile.size:以bytes表示的上傳的文件的大小。還有其他的幾個方法和屬性。你可以自己去查。把他們放在一起,這里是一個你處理上傳文件的通常方法:def handle_uploaded_file(f):    destination = open('some/file/name.txt','wb+')    for chunk in f.chunks():         destination.write(chunk)    destination.close()在UploadedFile.chunks()上循環而不是用read()保證大文件不會大量使用你的系統內存。上傳的數據存在哪里?在你保存上傳的文件之前,數據需要被保存在某些地方。默認呢的,如果一個上傳的文件小于2.5兆,Django會將上傳的東西放在內存里。這意味著只要從內存讀取數據并保存到硬盤上,所以很快。然而,如果一個上傳的文件太大,Django將將上傳的文件寫到一個臨時的文件中,這個文件在你的臨時文件路徑中。在Unix-like的平臺上意味著你可以預見Django產生一個文件保存為/tmp/tmpzfp6I6.upload的文件。如果這個文件足夠大,你可以觀察到這個文件的大小在增大。很多細節--2.5M;/tmp;等 等 都是簡單的看上去合理的默認值。繼續閱讀看看你怎么樣個性化或者完全替代掉上傳行為。改變上傳處理行為三個設置改變Django的上傳處理行為:FILE_UPLOAD_MAX_MEMORY_SIZE:以bytes為單位的到內存中的最大大小,。比這個值大的文件將被先存到磁盤上。默認是2.5兆FILE_UPLOAD_TEMP_DIR:比FILE_UPLOAD_MAX_MEMORY_SIZE大的文件將被臨時保存的地方。默認是系統標準的臨時路徑。FILE_UPLOAD_PERMISSIONS:如果這個沒有給出或者是None,你將獲得獨立于系統的行為。大多數平臺,臨時文件有一個0600模式,從內存保存的文件將使用系統標準umask。FILE_UPLOAD_HANDLERS:上傳文件的處理器。改變這個設置允許完全個性化——甚至代替——Django的上傳過程。默認是:("django.core.files.uploadhandler.MemoryFileUploadHandler", "django.core.files.uploadhandler.TemporaryFileUploadHandler",)UploadedFile 對象class UploadedFile作為那些重File繼承的補充,素有的UploadedFile對象定義了下面的方法和屬性:UploadedFile.content_type文件的content_type頭(比如text/plain orapplication/pdf)。像用戶提供的任何數據一樣,你不應該信任上傳的數據就是這個類型。你仍然要驗證這個文件包含這個頭聲明的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對象應該來自后來的上傳處理句柄。

剩下的就是可選的一些方法實現。

FILE_UPLOAD_MAX_MEMORY_SIZE = 209715200 FILE_UPLOAD_MAX_MEMORY_SIZE = 209715200

在你本機先好好測試一下,它是如何占用內存,什么時候開始存入temp目錄,怎么遷移到upload目錄底下的

文件上傳的時候,如果一個上傳的文件小于2.5兆,Django會將上傳的東西放在內存里,如果上傳的文件大于2.5M,Django將整個上傳的文件寫到一個臨時的文件中,這個文件在臨時文件路徑中。上傳完畢后,將調用View中的_Upload()方法將臨時文件夾中的臨時文件分塊寫到上傳文件的存放路徑下,每塊的大小為64K,寫完后臨時文件將被刪除。

UploadedFile.multiple_chunks():如果上傳的文件足夠大需要分塊就返回真。默認的這個值是2.5兆,當然這個值是可以調節的,看下面的UploadedFile.chunks():一個產生器,返回文件的塊。如果multiple_chunks()是真的話,你應該在一個循環中使用這個方法,而不是使用read();

在你保存上傳的文件之前,數據需要被保存在某些地方。默認呢的,如果一個上傳的文件小于2.5兆,Django會將上傳的東西放在內存里。這意味著只要從內存讀取數據并保存到硬盤上,所以很快。然而,如果一個上傳的文件太大,Django將上傳的文件寫到一個臨時的文件中,這個文件在你的臨時文件路徑中。在Unix-like的平臺上意味著你可以預見Django產生一個文件保存為/tmp/tmpzfp6I6.upload的文件。如果這個文件足夠大,你可以觀察到這個文件的大小在增大。

三個設置改變Django的上傳處理行為:FILE_UPLOAD_MAX_MEMORY_SIZE:以bytes為單位的到內存中的最大大小,。比這個值大的文件將被先存到磁盤上。默認是2.5兆FILE_UPLOAD_TEMP_DIR:比FILE_UPLOAD_MAX_MEMORY_SIZE大的文件將被臨時保存的地方。默認是系統標準的臨時路徑。FILE_UPLOAD_PERMISSIONS:如果這個沒有給出或者是None,你將獲得獨立于系統的行為。大多數平臺,臨時文件有一個0600模式,從內存保存的文件將使用系統標準umask。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
韩国视频理论视频久久| 伦伦影院午夜日韩欧美限制| 久久99国产精品自在自在app| 最新国产精品亚洲| 5566日本婷婷色中文字幕97| 久久久91精品国产| 中文在线资源观看视频网站免费不卡| 国产精品va在线播放我和闺蜜| 成人写真视频福利网| 国产精品爽爽ⅴa在线观看| 亚洲色图在线观看| 久久国产一区二区三区| 日韩成人在线电影网| 国产网站欧美日韩免费精品在线观看| 欧美极品少妇与黑人| 亚洲成人教育av| 在线观看国产欧美| 日韩欧美成人免费视频| 在线观看成人黄色| 91av网站在线播放| 久久久久久久久久久国产| 久久久久999| 2020国产精品视频| 91精品视频一区| 日韩a**站在线观看| 欧美色xxxx| 成人国产精品色哟哟| 欧美成人剧情片在线观看| 亚洲系列中文字幕| 国产一区二区三区高清在线观看| 国产成人在线播放| 精品丝袜一区二区三区| 亚洲成人999| 精品中文字幕乱| 日韩激情av在线免费观看| 久久激情视频免费观看| 国产精品久久91| 精品欧美aⅴ在线网站| 97成人精品视频在线观看| 国产精品a久久久久久| 亚洲性猛交xxxxwww| 日韩高清有码在线| 欧美成人精品h版在线观看| 亚洲国产第一页| 亚洲精品国产精品国自产在线| 亚洲国产高清高潮精品美女| 亚洲福利在线播放| 精品中文字幕在线2019| 国产有码一区二区| 综合国产在线视频| 伊人久久精品视频| 久久91亚洲精品中文字幕| 国产精品夜色7777狼人| 久久久久中文字幕2018| 欧美激情精品久久久久| 欧美激情免费观看| 91产国在线观看动作片喷水| 亚洲少妇激情视频| 91精品国产自产在线| 欧美刺激性大交免费视频| 亚洲精品电影网站| 亚洲欧洲自拍偷拍| 国内精品一区二区三区四区| 91高清视频在线免费观看| 国产精品入口尤物| 亚洲影视九九影院在线观看| 亚洲毛片在线免费观看| 欧美理论电影网| 欧美国产日韩免费| 欧美日韩亚洲网| 亚洲欧美日韩一区二区在线| 日本午夜在线亚洲.国产| 日韩av在线影视| 亚洲一区二区三区香蕉| 国产69精品久久久久9999| 久久手机免费视频| 国产精品永久在线| 91精品视频免费观看| 亚洲第一区第一页| 亚洲精品一区在线观看香蕉| 北条麻妃99精品青青久久| 日韩精品免费在线视频| 日韩精品久久久久| 国产精品va在线播放我和闺蜜| 国产最新精品视频| 欧美裸身视频免费观看| 久久777国产线看观看精品| 福利精品视频在线| 亚洲国产欧美在线成人app| 国产精品美女久久久久久免费| 国产精品久久久久久婷婷天堂| 5252色成人免费视频| 亚洲欧美激情四射在线日| 国产成人一区二区三区电影| 亚洲aaa激情| 国产极品jizzhd欧美| 最新国产成人av网站网址麻豆| 国产精品久久久久久久久久久不卡| 国内自拍欧美激情| 国产精品青青在线观看爽香蕉| 欧美电影第一页| 欧美性感美女h网站在线观看免费| 亚洲精品午夜精品| 亚洲国产99精品国自产| 在线一区二区日韩| 久久偷看各类女兵18女厕嘘嘘| 欧美成人一区在线| 亚洲福利精品在线| 欧美日韩人人澡狠狠躁视频| 亚洲欧美综合v| 日韩三级成人av网| 91久久精品国产91性色| 欧美激情videoshd| 欧美激情在线有限公司| 日韩欧美在线视频日韩欧美在线视频| 欧美裸体xxxx极品少妇软件| 日韩欧美国产免费播放| 欧美精品亚州精品| 亚洲一区二区久久久久久久| 亚洲国产一区二区三区在线观看| 国产成人涩涩涩视频在线观看| 欧美视频国产精品| 在线精品播放av| 青青久久aⅴ北条麻妃| 中文字幕亚洲一区在线观看| 亚洲国产欧美精品| 国产精品mp4| 成人激情电影一区二区| 日韩成人av在线| 日韩成人网免费视频| 4438全国亚洲精品在线观看视频| 成人久久一区二区三区| 久久久久久18| 亚洲精品一区二区在线| 69久久夜色精品国产69乱青草| 亚洲欧美精品中文字幕在线| 日韩精品在线观看一区| 欧美性猛交xxxx偷拍洗澡| 亚洲影院高清在线| 亚洲人a成www在线影院| 国产99久久精品一区二区永久免费| www.99久久热国产日韩欧美.com| 亚洲无限乱码一二三四麻| 中文字幕日韩综合av| 久久久精品国产一区二区| 亚洲精品福利资源站| 中文字幕最新精品| 2020久久国产精品| 久久成年人免费电影| 91视频国产一区| 欧美精品成人在线| 亚洲一区二区三区sesese| 国产成人精品999| 国产亚洲视频在线观看| 久久综合亚洲社区| 疯狂蹂躏欧美一区二区精品| 久久综合亚洲社区| 欧美性受xxxx黑人猛交| 欧美大尺度激情区在线播放| 欧美电影在线观看| 亚洲片国产一区一级在线观看| 国产精品一二三在线| 久久久久久国产精品美女| 久久中文字幕一区|