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 参数改变最大长度的值.