default_storage

>>> from django.core.files.base import ContentFile
>>> from django.core.files.storage import default_storage >>> 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

The built-in filesystem storage class

from django.core.files.storage import FileSystemStorage
from django.db import models fs = FileSystemStorage(location='/media/photos') class Car(models.Model):
...
photo = models.ImageField(storage=fs)

django提供了一系列api用来处理ImageField对象和FileField对象

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 = 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'

django提供了 django.core.files.File来代表一个file文件

大多数情况下,您将使用django提供的File类

>>> from django.core.files import File

# Create a Python file object using open()
>>> f = open('/path/to/hello.world', 'w')
>>> myfile = File(f)

现在你就可以使用django提供的File api了。以这种方式创建的文件不会自动关闭,以下方法可以用于关闭文件

>>> from django.core.files import File

# Create a Python file object using open() and the with statement
>>> with open('/path/to/hello.world', 'w') as f:
... myfile = File(f)
... myfile.write('Hello World')
...
>>> myfile.closed
True
>>> f.closed
True

File storage

在幕后,Django将决定如何以及在何处将文件存储到文件存储系统。这个对象实际上能够理解文件系统、打开和读取文件等内容。

Django的默认文件存储由DEFAULT_FILE_STORAGE设置提供;如果您没有显式地提供存储系统,那么将使用这个系统。

有关内置默认文件存储系统的详细信息,请参阅下面的“编写自定义存储系统”,了解如何编写自己的文件存储系统

Storage object

虽然在大多数情况下,您希望使用File对象(它将委托给该文件的适当存储),但是您可以直接使用文件存储系统。您可以创建某个自定义文件存储类的实例,或者(通常更有用)您可以使用全局默认存储系统

Storage object api

django提供了两种方便的方法使用当前storage class

class DefalutStorage
  1. DefaultStorage提供对DEFAULT_FILE_STORAGE定义的当前默认存储系统的延迟访问。
  • DefaultStorage在内部使用get_storage_class()。
get_storage_class
  1. 返回实现存储API的类或模块。
  2. 在没有调用import_path参数get_storage_class时,将返回DEFAULT_FILE_STORAGE定义的当前默认存储系统。如果提供了import_path, get_storage_class将尝试从给定的路径导入类或模块,如果成功,将返回它。如果导入失败,将引发异常。
The FileSystemStorage class

class FileSystemStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None)

文件系统存储类在本地文件系统上实现基本的文件存储。它从存储中继承并为其所有公共方法提供实现。

location

    保存文件的目录的绝对路径。默认设置为MEDIA_ROOT设置的值

base_url

    服务存储在此位置的文件的URL。默认为MEDIA_URL设置的值

file_permissions_mode

    文件保存时将接收的文件系统权限。默认为FILE_UPLOAD_PERMISSIONS

directory_permissions_mode

    保存目录时将接收的文件系统权限。默认为FILE_UPLOAD_DIRECTORY_PERMISSIONS。

get_created_time

    返回系统的ctime的日期时间,即os.path.getctime()。在某些系统(如Unix)上,这是最后一次元数据更改的时间,而在其他系统(如Windows)上,这是文件的创建时间。

The Storage class

存储类为存储文件提供了标准化的API,以及所有其他存储系统可以根据需要继承或覆盖的一组默认行为。

delete(name)

    删除按名称引用的文件。如果目标存储系统不支持删除,则会导致引起NotImplementedError

exists(name)

    如果指定名称引用的文件已经存在于存储系统中,则返回True;如果新文件的名称可用,则返回False

get_accessed_time(name)

    返回文件最后一次访问时间的日期时间。对于无法返回上次访问时间的存储系统,这将引起NotImplementedError。

如果USE_TZ为真,则返回一个感知的datetime,否则返回一个本地时区的普通datetime

get_available_name(name, max_length=None)

    返回一个基于name参数的文件名,该参数是免费的,可用于在目标存储系统上写入新内容。

如果提供的话,文件名的长度将不会超过max_length。如果找不到免费的唯一文件名,就会引发可疑文件操作异常。

如果文件名已经存在,则在扩展名前附加一个下划线和一个随机的7个字母数字字符串

get_created_time(name)

    返回文件创建时间的日期时间。对于无法返回创建时间的存储系统,这将引起NotImplementedError。

get_modified_time(name)

    返回文件最后修改时间的日期时间。对于无法返回最后一次修改时间的存储系统,这将引起NotImplementedError。

get_valid_name(name)

    返回一个基于名称参数的文件名,该参数适用于目标存储系统。

generate_filename(filename)

    通过调用get_valid_name()来验证文件名,并返回要传递给save()方法的文件名。

filename参数可能包括FileField.upload_to返回的路径。在这种情况下,路径不会被传递给get_valid_name(),而是会被转回结果名。

默认实现使用os。路径的操作。如果该方法不适用于您的存储,请重写此方法

listdir(path)

    列出指定路径的内容,返回一个列表的二元组;第一项是目录,第二项是文件。对于无法提供此类清单的存储系统,这将引发NotImplementedError。

open(name, mode='rb')

    打开名称指定的文件。注意,虽然返回的文件被保证为file对象,但它实际上可能是某个子类。在远程文件存储的情况下,这意味着读/写可能相当慢,所以要注意

path(name)

    可以使用Python的标准open()打开文件的本地文件系统路径。对于无法从本地文件系统访问的存储系统,这将引起NotImplementedError。

save(name, content, max_length=None)

    使用存储系统保存新文件,最好指定名称。如果已经存在具有此名称名称的文件,存储系统可以根据需要修改文件名以获得唯一名称。存储文件的实际名称将被返回。

max_length参数传递给get_available_name()。

内容参数必须是django.core.files的实例。文件或可以包装在文件中的类文件对象。

size(name)

返回按名称引用的文件的总大小(以字节为单位)。对于无法返回文件大小的存储系统,这将引起NotImplementedError。

url(name)

返回URL,在这里可以访问按名称引用的文件的内容。对于不支持通过URL访问的存储系统,这将引起NotImplementedError。

Django FileFieldManage的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  3. django server之间通过remote user 相互调用

    首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  7. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  8. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  9. Django

    一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...

随机推荐

  1. poi操作word 2007 常用方法总结

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  2. objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?

    今天在看书上的一段代码时,发现NSString实例化时,有时用的是initWithFormat方法,有时用的是stringWithFormat,到底应该如何选择呢? 区别: 1.initWithFor ...

  3. git命令用法

    git svn  说明 git pull svn update   git add 要提交的文件名 svn add   git rm svn rm,del   git commit -m '备注一下提 ...

  4. DAVINCI开发原理

    本文中约定: [host] 表示主机PC机Linux [target] 表示目标板Linux DAVINCI开发原理之一----ARM端开发环境的建立(DVEVM) 1. 对DAVINCI平台,TI在 ...

  5. 软件工程第二次作业(Android Studio利用Junit进行单元测试)

    一.开发工具的安装和运行 1.安装 由于我的电脑之前就安装好了Android Studio,就不再重装了.在这里就给出几条安装过程中需要注意的地方吧: 安装包最好在官网下载已经带有Android SD ...

  6. Android开发实战之ViewPager的轮播

    在安卓开发的许多控件中,如果你没有使用过ViewPager,就不能算是一个安卓开发工程师,在本篇博文中,我会总结ViewPager的使用方法, 以及一些开发中的拓展.希望本篇博文对你的学习和工作有所帮 ...

  7. EMC校招笔试题目

    ------------------------------------------------- 1,7×(1/7) = 1是什么率? 乘法运算满足结合律,交换律和分配率.这个题目用的应该是交换律. ...

  8. 【LA3523 训练指南】圆桌骑士 【双连通分量】

    题意 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防赞同和反 ...

  9. 第一个Django应用程序_part3

    一.概述 此文延续第一个Django应用程序part2. 官方文档:https://docs.djangoproject.com/en/1.11/intro/tutorial03/ view是Djan ...

  10. SpringBoot 集成Mybatis时 使用通用插件Mapper 注意事项

    1.如果在SpringBoot的启动入口类上面加入注解 @MapperScan(basePackages = "com.leecx.mapper")      使用的是   org ...