# 管理文件 #
這篇文檔描述了Django為那些用戶上傳文件準備的文件訪問API。底層的API足夠通用,你可以使用為其它目的來使用它們。如果你想要處理靜態文件(JS,CSS,以及其他),參見[管理靜態文件(CSS和圖像)](http://python.usyiyi.cn/django/howto/static-files/index.html)。
通常,Django使用`MEDIA_ROOT `和 `MEDIA_URL`設置在本地儲存文件。下面的例子假設你使用這些默認值。
然而,Django提供了一些方法來編寫自定義的 [文件儲存系統](http://python.usyiyi.cn/django/topics/files.html#file-storage),允許你完全自定義Django在哪里以及如何儲存文件。這篇文檔的另一部分描述了這些儲存系統如何工作。
## 在模型中使用文件 ##
當你使用`FileField` 或者 `ImageField`的時候,Django為你提供了一系列的API用來處理文件。
考慮下面的模型,它使用`ImageField`來儲存一張照片:
```
from django.db import models
class Car(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=5, decimal_places=2)
photo = models.ImageField(upload_to='cars')
```
任何`Car`的實例都有一個 `photo`字段,你可以通過它來獲取附加圖片的詳細信息:
```
>>> car = Car.objects.get(name="57 Chevy")
>>> car.photo
<ImageFieldFile: chevy.jpg>
>>> car.photo.name
'cars/chevy.jpg'
>>> car.photo.path
'/media/cars/chevy.jpg'
>>> car.photo.url
'http://media.example.com/cars/chevy.jpg'
```
例子中的`car.photo` 對象是一個`File` 對象,這意味著它擁有下面描述的所有方法和屬性。
> 注意
>
> 文件保存是數據庫模型保存的一部分,所以磁盤上真實的文件名在模型保存之前并不可靠。
例如,你可以通過設置文件的 `name`屬性為一個和文件儲存位置 (`MEDIA_ROOT`,如果你使用默認的`FileSystemStorage`)相關的路徑,來修改文件名稱。
```
>>> import os
>>> from django.conf import settings
>>> initial_path = car.photo.path
>>> car.photo.name = 'cars/chevy_ii.jpg'
>>> new_path = settings.MEDIA_ROOT + car.photo.name
>>> # Move the file on the filesystem
>>> os.rename(initial_path, new_path)
>>> car.save()
>>> car.photo.path
'/media/cars/chevy_ii.jpg'
>>> car.photo.path == new_path
True
```
## File ##
當Django需要表示一個文件的時候,它在內部使用`django.core.files.File`實例。這個對象是 Python [內建文件對象](https://docs.python.org/library/stdtypes.html#bltin-file-objects)的一個簡單封裝,并帶有一些Django特定的附加功能。
大多數情況你可以簡單地使用Django提供給你的`File`對象(例如像上面那樣把文件附加到模型,或者是上傳的文件)。
如果你需要自行構造一個`File`對象,最簡單的方法是使用Python內建的`file` 對象來創建一個:
```
>>> from django.core.files import File
# Create a Python file object using open()
>>> f = open('/tmp/hello.world', 'w')
>>> myfile = File(f)
```
現在你可以使用 `File`類的任何文檔中記錄的屬性和方法了。
注意這種方法創建的文件并不會自動關閉。以下步驟可以用于自動關閉文件:
```
>>> from django.core.files import File
# Create a Python file object using open() and the with statement
>>> with open('/tmp/hello.world', 'w') as f:
... myfile = File(f)
... myfile.write('Hello World')
...
>>> myfile.closed
True
>>> f.closed
True
```
在處理大量對象的循環中訪問文件字段時,關閉文件極其重要。如果文件在訪問之后沒有手動關閉,會有消耗完文件描述符的風險。這可能導致如下錯誤:
```
IOError: [Errno 24] Too many open files
```
## 文件儲存 ##
在背后,Django需要決定在哪里以及如何將文件儲存到文件系統。這是一個對象,它實際上理解一些東西,比如文件系統,打開和讀取文件,以及其他。
Django的默認文件儲存由`DEFAULT_FILE_STORAGE`設置提供。如果你沒有顯式提供一個儲存系統,就會使用它。
關于內建的默認文件儲存系統的細節,請參見下面一節。另外,關于編寫你自己的文件儲存系統的一些信息,請見[編寫自定義的文件系統](http://python.usyiyi.cn/django/howto/custom-file-storage.html)。
### 儲存對象 ###
大多數情況你可能并不想使用`File`對象(它向文件提供適當的存儲功能),你可以直接使用文件儲存系統。你可以創建一些自定義文件儲存類的實例,或者 – 大多數情況更加有用的 – 你可以使用全局的默認儲存系統:
```
>>> from django.core.files.storage import default_storage
>>> from django.core.files.base import ContentFile
>>> path = default_storage.save('/path/to/file', ContentFile('new content'))
>>> path
'/path/to/file'
>>> default_storage.size(path)
11
>>> default_storage.open(path).read()
'new content'
>>> default_storage.delete(path)
>>> default_storage.exists(path)
False
```
關于文件儲存API,參見 [文件儲存API](http://python.usyiyi.cn/django/ref/files/storage.html)。
### 內建的文件系統儲存類 ###
Django自帶了`django.core.files.storage.FileSystemStorage` 類,它實現了基本的本地文件系統中的文件儲存。
例如,下面的代碼會在 `/media/photos` 目錄下儲存上傳的文件,無論`MEDIA_ROOT`設置是什么:
```
from django.db import models
from django.core.files.storage import FileSystemStorage
fs = FileSystemStorage(location='/media/photos')
class Car(models.Model):
...
photo = models.ImageField(storage=fs)
```
[自定義儲存系統](http://python.usyiyi.cn/django/howto/custom-file-storage.html) 以相同方式工作:你可以把它們作為`storage`參數傳遞給`FileField`。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Managing files](https://docs.djangoproject.com/en/1.8/topics/files/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架