---
title: "文件存储 API"
version: 6.0
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/6.0/ref/files/storage/
canonical: https://djangodocs.dev/zh-hans/6.0/ref/files/storage/
---
# 文件存储 API

## 获取默认的存储类：

Django 提供了便捷的方式来访问默认的存储类：

#### `storages`

一个类似字典的对象，允许使用 [`STORAGES`](/zh-hans/6.0/ref/settings/#std-setting-STORAGES) 中定义的别名检索存储实例。

`storages` 有一个属性 `backends`，它默认为 [`STORAGES`](/zh-hans/6.0/ref/settings/#std-setting-STORAGES) 中提供的原始值。

此外，`storages` 提供了一个 `create_storage()` 方法，它接受 [`STORAGES`](/zh-hans/6.0/ref/settings/#std-setting-STORAGES) 中用于后端的字典，并返回基于该后端定义的存储实例。这对于需要在测试中实例化存储的第三方包可能很有用：

```pycon
>>> from django.core.files.storage import storages
>>> storages.backends
{'default': {'BACKEND': 'django.core.files.storage.FileSystemStorage'},
 'staticfiles': {'BACKEND': 'django.contrib.staticfiles.storage.StaticFilesStorage'},
 'custom': {'BACKEND': 'package.storage.CustomStorage'}}
>>> storage_instance = storages.create_storage({"BACKEND": "package.storage.CustomStorage"})
```

#### `class DefaultStorage`

[`DefaultStorage`](#django.core.files.storage.DefaultStorage) 提供了对由 [`STORAGES`](/zh-hans/6.0/ref/settings/#std-setting-STORAGES) 中的 `default` 键定义的默认存储系统的延迟访问。[`DefaultStorage`](#django.core.files.storage.DefaultStorage) 内部使用了 [`storages`](#django.core.files.storage.storages)。

#### `default_storage`

[`default_storage`](#django.core.files.storage.default_storage) 是 [`DefaultStorage`](#django.core.files.storage.DefaultStorage) 的一个实例。

## `FileSystemStorage` 类

#### `class FileSystemStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None, allow_overwrite=False)`

[`FileSystemStorage`](#django.core.files.storage.FileSystemStorage) 类实现了本地文件系统的基本文件存储。它继承自 [`Storage`](#django.core.files.storage.Storage) 类，并提供了其中所有公开方法的实现。

> **Note**
>
> 如果给定的文件名不存在，`FileSystemStorage.delete()` 方法不会引发异常。

#### `location`

存放文件的目录的绝对路径。 默认为你的 [`MEDIA_ROOT`](/zh-hans/6.0/ref/settings/#std-setting-MEDIA_ROOT) 配置的值。

#### `base_url`

为存储在此位置的文件提供服务的 URL。默认为你的 [`MEDIA_URL`](/zh-hans/6.0/ref/settings/#std-setting-MEDIA_URL) 配置的值。

#### `file_permissions_mode`

保存文件时，文件系统将获得的权限。默认为 [`FILE_UPLOAD_PERMISSIONS`](/zh-hans/6.0/ref/settings/#std-setting-FILE_UPLOAD_PERMISSIONS)。

#### `directory_permissions_mode`

保存目录时，该目录将获得的文件系统权限，默认为 [`FILE_UPLOAD_DIRECTORY_PERMISSIONS`](/zh-hans/6.0/ref/settings/#std-setting-FILE_UPLOAD_DIRECTORY_PERMISSIONS)。

#### `allow_overwrite`

控制是否允许保存新文件覆盖现有文件的标志。默认为 `False`。

#### `get_created_time(name)`

返回系统 ctime 的 [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime)，即 [`os.path.getctime()`](https://docs.python.org/3/library/os.path.html#os.path.getctime)。在某些系统上（如 Unix），这是最后一次修改元数据的时间，而在其他系统上（如 Windows），这是文件的创建时间。

## `InMemoryStorage` 类

#### `class InMemoryStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None)`

[`InMemoryStorage`](#django.core.files.storage.InMemoryStorage) 类实现了基于内存的文件存储。它没有持久性，但可以通过避免磁盘访问来加速测试。

#### `location`

文件分配的目录名称的绝对路径。默认值为 [`MEDIA_ROOT`](/zh-hans/6.0/ref/settings/#std-setting-MEDIA_ROOT) 设置的值。

#### `base_url`

为存储在此位置的文件提供服务的 URL。默认为你的 [`MEDIA_URL`](/zh-hans/6.0/ref/settings/#std-setting-MEDIA_URL) 配置的值。

#### `file_permissions_mode`

文件系统分配给文件的文件系统权限，为了与 `FileSystemStorage` 兼容而提供。默认值为 [`FILE_UPLOAD_PERMISSIONS`](/zh-hans/6.0/ref/settings/#std-setting-FILE_UPLOAD_PERMISSIONS)。

#### `directory_permissions_mode`

文件系统分配给目录的文件系统权限，为了与 `FileSystemStorage` 兼容而提供。默认值为 [`FILE_UPLOAD_DIRECTORY_PERMISSIONS`](/zh-hans/6.0/ref/settings/#std-setting-FILE_UPLOAD_DIRECTORY_PERMISSIONS)。

## `Storage` 类

#### `class Storage`

[`Storage`](#django.core.files.storage.Storage) 类为存储文件提供了一个标准化的 API，以及一组默认行为，所有其他存储系统可以根据需要继承或覆盖。

> **Note**
>
> 当方法返回未处理的 `datetime` 对象时，所使用的有效时区将是 `os.environ['TZ']` 的当前值；注意，这通常是由 Django 的 [`TIME_ZONE`](/zh-hans/6.0/ref/settings/#std-setting-TIME_ZONE) 设置的。

#### `delete(name)`

删除 `name` 引用的文件。如果目标存储系统不支持删除，这将引发 `NotImplementedError`。

#### `exists(name)`

如果存储系统中已存在给定名称引用的文件，则返回 `True`。

#### `get_accessed_time(name)`

返回文件最后访问时间的 [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime)。对于不能返回最后访问时间的存储系统，将引发 [`NotImplementedError`](https://docs.python.org/3/library/exceptions.html#NotImplementedError)。

如果 [`USE_TZ`](/zh-hans/6.0/ref/settings/#std-setting-USE_TZ) 为 `True`，则返回一个处理过的 `datetime`，否则返回一个当地时区的未处理的 `datetime`。

#### `get_alternative_name(file_root, file_ext)`

根据 `file_root` 和 `file_ext` 参数返回一个替代的文件名，一个下划线加上一个随机的 7 个字符的字母数字字符串被附加到文件名的扩展名之前。

#### `get_available_name(name, max_length=None)`

返回一个基于 `name` 参数的文件名，该文件名在目标存储系统中是空闲的，可供新内容写入。

文件名的长度不会超过 `max_length`，如果提供的话。如果不能找到一个空闲的唯一文件名，将引发一个 [`SuspiciousFileOperation`](/zh-hans/6.0/ref/exceptions/#django.core.exceptions.SuspiciousOperation) 异常。

如果一个带有 `name` 的文件已经存在，则调用 [`get_alternative_name()`](/zh-hans/6.0/howto/custom-file-storage/#django.core.files.storage.get_alternative_name) 来获得一个替代名称。

#### `get_created_time(name)`

返回文件的创建时间的 [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime)。对于不能返回创建时间的存储系统，将引发 [`NotImplementedError`](https://docs.python.org/3/library/exceptions.html#NotImplementedError)。

如果 [`USE_TZ`](/zh-hans/6.0/ref/settings/#std-setting-USE_TZ) 为 `True`，则返回一个处理过的 `datetime`，否则返回一个当地时区的未处理的 `datetime`。

#### `get_modified_time(name)`

返回文件最后修改时间的 [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime)。对于不能返回最后修改时间的存储系统，将引发 [`NotImplementedError`](https://docs.python.org/3/library/exceptions.html#NotImplementedError)。

如果 [`USE_TZ`](/zh-hans/6.0/ref/settings/#std-setting-USE_TZ) 为 `True`，则返回一个处理过的 `datetime`，否则返回一个当地时区的未处理的 `datetime`。

#### `get_valid_name(name)`

根据 `name` 参数返回一个适合在目标存储系统中使用的文件名。

#### `generate_filename(filename)`

Validates the `filename` by calling [`get_valid_name`](/zh-hans/6.0/howto/custom-file-storage/#django.core.files.storage.get_valid_name) and
returns a filename to be passed to the [`save()`](#django.core.files.storage.Storage.save) method.

The `filename` argument may include a path as returned by
[`FileField.upload_to`](/zh-hans/6.0/ref/models/fields/#django.db.models.FileField.upload_to).
In that case, the path won't be passed to [`get_valid_name`](/zh-hans/6.0/howto/custom-file-storage/#django.core.files.storage.get_valid_name) but
will be prepended back to the resulting name.

默认实现使用 [`os.path`](https://docs.python.org/3/library/os.path.html#module-os.path) 操作。如果不适合你的存储，请重写这个方法。

#### `listdir(path)`

列出指定路径的内容，返回一个二元元组列表，第一项是目录，第二项是文件。对于不能提供这种列表的存储系统，这将引发一个 `NotImplementedError`。

#### `open(name, mode='rb')`

打开由 `name` 给出的文件。请注意，虽然返回的文件保证是一个 `File` 对象，但实际上它可能是某个子类。在远程文件存储的情况下，这意味着读／写可能会很慢，所以要注意。

#### `path(name)`

本地文件系统路径，在这里可以使用 Python 的标准 `open()` 打开文件。对于不能从本地文件系统访问的存储系统，这将引发 `NotImplementedError`。

#### `save(name, content, max_length=None)`

使用存储系统保存一个新的文件，最好使用指定的名称。如果已经存在一个带有这个名字 `name` 的文件，存储系统可以根据需要修改文件名以获得一个唯一的名字。将返回存储文件的实际名称。

`max_length` 参数被传递给 [`get_available_name()`](/zh-hans/6.0/howto/custom-file-storage/#django.core.files.storage.get_available_name)。

`content` 参数必须是 [`django.core.files.File`](/zh-hans/6.0/ref/files/file/#django.core.files.File) 的实例，或者是一个可以用 `File` 包装的类文件对象。

#### `size(name)`

返回 `name` 引用的文件的总大小，以字节为单位。对于不能返回文件大小的存储系统，将引发 `NotImplementedError`。

#### `url(name)`

返回可以访问 `name` 引用的文件内容的URL。对于不支持通过 URL 访问的存储系统，这将引发 `NotImplementedError`。

> **There are community-maintained solutions too!**
>
> Django has a vibrant ecosystem. There are storage backends
> highlighted on the [Community Ecosystem](https://www.djangoproject.com/community/ecosystem/#storage-and-static-files) page. The Django Packages
> [Storage Backends grid](https://djangopackages.org/grids/g/storage-backends/) has even more options for you!
