← 文件对象 | 总目录 | 管理文件 →
译者注:本地测试系统为widows 10
Django提供了两种方便的方法来访问当前的存储类:
DefaultStorage提供对当前默认存储系统的惰性(lazy) 访问,如 DEFAULT_FILE_STORAGE 中所述。DefaultStorage在内部使用get_storage_class() 方法。
返回实现存储API的类或模块。
在没有import_path参数的情况下,将返回当前 DEFAULT_FILE_STORAGE 设置的默认的存储系统 。如果提供了import_path, 将尝试从给定路径导入类或模块,并在成功时返回它。如果导入不成功,将引发异常。
from django.core.files.storage import get_storage_class
print(get_storage_class())
# 输出结果
<class 'django.core.files.storage.FileSystemStorage'>
class FileSystemStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None)
FileSystemStorage类实现对本地文件系统的基本文件存储。它继承自 Storage并提供其所有公共方法的实现。
保存文件的目录的绝对路径。默认为您的 MEDIA_ROOT 设置值。
>>> from django.core.files.storage import FileSystemStorage
>>> fs.location
'D:\\djpro\\learn'
提供存储在此位置的文件的URL。默认为您的 MEDIA_URL 设置值。
>>> from django.conf import settings
>>> settings.MEDIA_ROOT
''
>>> fs.base_url
''
保存文件时文件系统权限。默认为 FILE_UPLOAD_PERMISSIONS 。
>>> fs.file_permissions_mode
>>> fs.file_permissions_mode is None
True
保存目录时将接收的文件系统权限。默认为FILE_UPLOAD_DIRECTORY_PERMISSIONS。
注意
如果给定的文件名不存在,则 FileSystemStorage.delete() 方法不会引发异常。
>>> fs.directory_permissions_mode is None
True
返回系统的时钟时间的datetime,即 os.path.getctime()。在某些系统(如Unix)上,这是最后一次元数据更改的时间,而在其他系统(如Windows)上,则是文件的创建时间。
>>> fs.get_created_time('1.PNG')
datetime.datetime(2018, 12, 21, 14, 12, 42, 546314)
class Storage
Storage类为存储文件提供了一系列标准API,使用一组所有其他存储系统可以继承或根据需要覆盖默认行为。
注意
当方法返回navie datetime对象时,使用的有效时区将是当前os.environ['TZ']
值; 请注意,这通常是Django设置中的TIME_ZONE。
删除引用的名为name的文件。如果目标存储系统上不支持删除,这将抛出异常NotImplementedError
>>> from django.core.files.storage import Storage
>>> from django.core.files.storage import FileSystemStorage
>>> s = Storage()
>>> s.delete('1.PNG')
Traceback (most recent call last):
File "" , line 1, in <module>
File "C:\Python37\lib\site-packages\django\core\files\storage.py", line 115, in delete
raise NotImplementedError('subclasses of Storage must provide a delete() method')
NotImplementedError: subclasses of Storage must provide a delete() method
>>> fs = FileSystemStorage()
>>> fs.delete('1.PNG') # 成功删除
如果给定的name引用的文件在存储系统中已经存在,返回True;或者False如果name可用于一个新的文件。
>>> fs = FileSystemStorage()
>>> fs.exists('1.PNG')
True
返回文件的上次访问时间datetime。对于无法返回上次访问时间的存储系统,这将引发NotImplementedError。
如果USE_TZ=True
,则返回一个感知型的datetime,否则在本地时区返回一个天真型(naive) 的datetime。
>>> fs.get_accessed_time('1.PNG')
datetime.datetime(2018, 12, 21, 14, 12, 42, 868682)
返回基于name参数的文件名,该name是不与系统其他文件不重复的,可用于在目标存储系统上写入的新内容。
如果提供,文件名的长度不会超过max_length。如果找不到唯一文件名, 则会引发异常SuspiciousFileOperation。
如果文件name已存在,则在扩展名之前将下划线加上随机的7个字符的字母数字字符串附加到文件名。
>>> fs.exists('1.PNG')
True
>>> fs.get_available_name('1.PNG')
'1_JO4vUa7.PNG'
>>> fs.get_available_name('1.PNG')
'1_7CsmN5W.PNG'
>>> fs.get_available_name('2.PNG')
'2.PNG'
返回文件的创建时间的datetime。对于无法返回创建时间的存储系统,这将抛出异常 NotImplementedError。
如果USE_TZ=True
,则返回一个感知型的datetime,否则在本地时区返回一个天真型(naive) 的datetime。
返回文件的上次修改时间的datetime。对于无法返回上次修改时间的存储系统,这将抛出异常NotImplementedError。
如果USE_TZ=True
,则返回一个感知型的datetime,否则在本地时区返回一个天真型(naive) 的datetime。
返回适合在目标存储系统上使用name参数返回的文件名。
通过调用get_valid_name()
验证filename,并将filename传递给save()方法。
该filename参数可能包括路径(由FileField.upload_to返回) 。在这种情况下,路径将不会传递给 get_valid_name(),但会先添加回结果名称。
默认实现使用os.path操作。如果这不适合您的存储,请覆盖此方法。
列出指定路径的内容,返回2元组列表; 第一项是目录,第二项是文件。对于无法提供此类列表的存储系统,这将引发NotImplementedError。
>>> fs.listdir('.')
(['.idea', 'formats', 'learn', 'news', 'polls', 'static', 'templates', 'topic', 'tour', 'venv'], ['1.PNG', '5bc58b6d63c04.jpg.PNG', 'db.sqlite3', 'manage.py', 'outtest.py'])
打开给定name的文件。请注意,虽然返回的文件保证是一个File对象,但它实际上可能是某个子类。在远程文件存储的情况下,这意味着读/写可能非常慢,因此请注意。
>>> f = fs.open('1.PNG',mode='rb')
>>> type(f)
<class 'django.core.files.base.File'>
可以使用Python内置open()打开文件的标准本地文件系统路径。对于无法从本地文件系统访问的存储系统,这将引发NotImplementedError。
>>> fs.path('1.PNG')
'D:\\djpro\\learn\\1.PNG'
使用存储系统保存新文件,最好使用指定的name。如果已存在具有此名称的文件name,则存储系统可根据需要修改文件名以获取唯一名称。将返回存储文件的实际名称。
这个max_length参数被传递给了 get_available_name()。
content参数必须是 django.core.files.File 类 的实例或可以包装在一个File中的类文件对象。
>>> from django.core.files import File
>>> fs.exists('2.PNG')
False
>>> f1 = open('1.PNG','rb')
>>> f1File = File(f1)
>>> fs.save('2.PNG',f1File)
'2.PNG'
>>> fs.exists('2.PNG')
True
返回引用的name文件的总大小(以字节为单位)。对于无法返回文件大小的存储系统,这将会引发NotImplementedError。
>>> fs.size('2.PNG')
6355
>>> fs.size('2.PNG') == fs.size('1.PNG')
True
返回name引用的文件内容的可以访问的URL 。对于不支持通过URL访问的存储系统,这将会引发NotImplementedError。