FileField¶
- class FileField([upload_to=None, max_length=100, **options])¶
一個上傳文件的字段。
注意
FileField字段不支持primary_key 和unique參數,如果使用會生成 TypeError錯誤
有兩個可選參數:
- FileField. upload_to ¶
-
Changed in Django 1.7:
在舊版本Django中,upload_to 屬性是必須要有的;
這將會添加一個本地文件系統路徑到 MEDIA_ROOT 設置中,來明確 url 屬性的值。
這個路徑可能會包含一個 strftime() 格式串,並且會在文件上傳時被替換為 實際的date/time作為文件路徑 (這樣上傳的文件就不會塞滿你指定的文件夾了).
這也可以是一個可調用對象,如函數。可以調用它來獲取上傳路徑,包括文件名。它必須接受兩個參數,並且返回一個Unix-style的路徑(帶有/)給存儲系統。這被傳遞的兩個參數為:
Argument Description instance FileField 被定義時的一個實例. 更准確地說,這是一個包含當前文件的特殊實例。
通常, 這個對象還沒有在數據庫中保存, 若該對象用的是默認的 AutoField字段, 那它的primary key 字段還可能沒有值.
filename The filename that was originally given to the file. This may or may not be taken into account when determining the final destination path.
- FileField. storage ¶
-
一個storage對象,用於你的文件的存取。參見Managing files獲取這個對象的細節。
這個字段在表格里的默認組件是 ClearableFileInput.
在模型中調用FileField 或 ImageField (見下方) 需如下幾步:
- 在你的settings文件中, 你必須要定義 MEDIA_ROOT 作為Django存儲上傳文件的路徑(從性能上考慮,這些文件不能存在數據庫中。) 定義一個 MEDIA_URL 作為基礎的URL或者目錄。確保這個目錄可以被web server使用的賬戶寫入。
- 在模型中添加FileField 或 ImageField 字段, 定義 upload_to參數,內容是 MEDIA_ROOT 的子目錄,用來存放上傳的文件。
- 數據庫中存放的僅是這個文件的路徑 (相對於MEDIA_ROOT). 你很可能會想用由Django提供的便利的url 屬性。比如說, 如果你的ImageField 命名為 mug_shot, 你可以在template中用 {{ object.mug_shot.url }}獲得你照片的絕對路徑。
例如,如果你的 MEDIA_ROOT設定為 '/home/media',並且 upload_to設定為 'photos/%Y/%m/%d'。 upload_to的'%Y/%m/%d'被strftime()所格式化;'%Y' 將會被格式化為一個四位數的年份, '%m' 被格式化為一個兩位數的月份'%d'是兩位數日份。如果你在Jan.15.2007上傳了一個文件,它將被保存在/home/media/photos/2007/01/15目錄下.
如果你想獲得上傳文件的存盤文件名,或者是文件大小,你可以分別使用 name 和 size 屬性; 更多可用屬性及方法信息,請參見 File類索引 和 Managing files 主題指導.
Note
保存的文件作為模型存儲在數據庫中的一部分,所以在磁盤上使用的實際的文件名在模型保存完畢之前是不可靠的。
上傳的文件對應的URL可以通過使用 url 屬性獲得. 在內部,它會調用 Storage 類下的url()方法.
值得注意的是,無論你在任何時候處理上傳文件的需求,你都應該密切關注你的文件將被上傳到哪里,上傳的文件類型,以避免安全漏洞。認證所有上傳文件 以確保那些上傳的文件是你所認為的文件。例如,如果你盲目的允許其他人在無需認證的情況下上傳文件至你的web服務器的root目錄中,那么別人可以上傳一個CGI或者PHP腳本然后通過訪問一個你網站的URL來執行這個腳本。所以,不要允許這種事情發生。
甚至是上傳HTML文件也值得注意,它可以通過瀏覽器(雖然不是服務器)執行,也可以引發相當於是XSS或者CSRF攻擊的安全威脅。
FileField 實例將會在你的數據庫中創建一個默認最大長度為100字符的varchar 列。就像其他的fields一樣, 你可以用 max_length 參數改變最大長度的值.
