Django开发过程中,文件的上传和使用
文件的上传
在model中使用FileFiled和ImageFiled,需要以下步骤:
- 在你的setting文件中,你需要定义
MEDIA_ROOT
,这是一个目录路径,作为你在Django中存储上传文件的地方。(为了性能,这些文件并不存储在数据库中)。你还需要定义MEDIA_URL
作为这个目录的一个基本公开的url。你也要确保当前Web服务器的这个用于拥有这个目录的写入权利。 - 在你的model中定义
FileField
和ImageField
,定义upload_to
这个选项,来指定MEDIA_ROOT
这个目录的一个子目录,来存储上传文件。 - 在你数据库中的保存的,是对应文件的路径(与
MEDIA_ROOT
有关),你肯定会愿意使用Django提供的url
属性。比如你的ImageField
叫做mug_shot
,那么在你的模板文件中,你可以通过{{object.mug_shot.url}}
来获取这个图片的绝对路径。
比如,你的MEDIA_ROOT
设为/home/media
,然后你的upload_to
被设定为photos/%Y/%m/%d
,%Y/%m/%d
部分是一种格式化,%Y
是4位年份,%m
是2位月份,%d
是2位天数。如果你在2007年1月15日上传了一个图片文件,那么它就会被存储在/home/media/2007/1/15/
这个目录下。
注意: 因为文件对象是作为model的一部份数据库中存储的,所以在数据库保存之前,真实的文件名并不能依靠
注意2:对上传的文件类型,一定要有严格的把控,如果一个人上传了可执行的脚本文件,那么你的服务器的安全就受到了威胁
原文中还介绍了一些高级使用,比如:文件重命名,文件读写,自定义一个storage system来实现远程存储等,但是当前项目实现我还用不到,有兴趣的同学可以去看一下
图片文件的使用
settitng.py
MEDIA_ROOT = BASE_DIR + '/media/' # BASE_DIR 是项目所在的目录,这样文件就会存储在当前的开发目录下的一个`media`的文件夹下
MEDIA_URL = '/media/'
urls.py
注意:不是app中的urls文件,而是整个项目的urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls'))
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
# 这是官方给出的在开发中显示图片的方式,但是只能用于本地开发的时候,也就是127.0.0.1的时候。而不能用在发布版本
此时你就可以在模板文件中引用相关的图片了
image是一个model,img是它的ImageField,url则是指向图片文件的url
<img src="{{image.img.url}}">
我在自己搭建的blog网站有使用到以上的技术,欢迎大家围观