2012-08-06 50 views
1

我有我的Django應用程序中的窗體。用戶可以在提交表單之前事先上傳文件。在上傳文件的處理程序中,我使用TemporaryUploadedFile。所以 - 文件存儲在/ tmp目錄中。該處理程序將響應發送到表單 - 包含文件路徑和文件擴展名的JSON對象。這些信息收集在一起。Django:控制時間TemporaryUploadedFile生命

提交表單後,該數組將被序列化。這裏是問題 - 當表單處理程序接收表單數據和文件名數組並嘗試訪問這些文件時 - 這裏是錯誤「沒有這樣的文件」。

所以,我的問題是 - 我該如何解決這個問題?也許我可以設置這個文件的生命時間更長的時間?或者,也許我應該使用UploadedFile而不是TemporaryUploadedFile。

TIA!

回答

3

TemporaryUploadedFile使用tempfile.NamedTemporaryFile。該Python docs有這樣一段話:

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]]) 

此功能工作 正是因爲TemporaryFile()確實,除了文件是保證 在文件系統中顯示的名稱(在Unix上,目錄項 不是沒有鏈接的)。該名稱可以從文件對象的名稱屬性 中檢索。當名稱可用於第二次打開文件 ,而指定的臨時文件仍處於打開狀態時,跨平臺變化 (它可在Unix上使用;不能在Windows NT 或更高版本上使用)。 如果刪除爲真(默認設置),該文件即將關閉(重點是我的)不久將被刪除爲 。

返回的對象始終是一個文件類對象,其文件屬性 是底層的真實文件對象。這個類文件對象可以在with語句中使用 ,就像普通文件一樣。

因此,這裏的默認行爲是在初始處理後自動關閉文件時自動刪除該文件。所以你有兩個選擇。您可以繼承TemporaryUploadedFile的子類並覆蓋__init__方法,以便您可以將delete=False傳遞給tempfile.NamedTemporaryFile(但當您完成後需要記住手動刪除文件以避免生成舊臨時文件),或者您可以製作請務必在處理上傳之前將您的TemporaryUploadedFile移到其他地方,然後將新位置發回。

使用UploadedFile是不合適的,因爲它是一個基類,本身並不打算實例化。

+0

Thx!但是當我試圖實現這個時,我遇到了一些麻煩。當我在上傳處理程序中處理request.FILES數據時 - request.FILES包含TemporaryUploadedFile對象(本機類,而不是由我實現的另一個類)。所以,文件將被刪除。 – dizpers 2012-08-07 17:51:17

+1

然後,您需要手動將文件保存到新位置。 – 2012-08-07 19:14:59