目录
1 前端
我们搞一个html文件,名称为upload_file.html
- 提交方式为post方式
- form的enctype属性为multipart/form-data
- 需要有一个type为file的input用于选择传哪个文件
- 需要有一个type为submit的input用于提交
- django中如果启用了csrf验证的中间件需要加入 % csrf_token %}
2 配置
在settings.py中需要增加两个变量
django把用户上传的文件称为media资源,MEDIA_URL是你访问那个路由可以得到media资源,MEDIA_ROOT是把media资源放在哪
- 与static(静态文件)用法相同,只是为了区分换一个叫法
之后在项目文件下放一个media文件夹用于存放上传的文件
3 路由
除了视图的路由以外,我们需要将media文件的路由与media文件的实际位置链接起来
- from django.conf import settings 就是settings.py那个文件
- from django.conf.urls.static import static 是将路由与文件链接起来,第一个参数是路由,第二个参数为文件位置
- 需要写在urlpatterns之后,这里我们等于是新加入了路由
如果你仅仅是上传而不在视图中进行使用,你也可以不加这个路由
4 视图
4.1 方案一
搞一个视图
- 使用request.FILES['文件名']可以拿到文件对象
- 可以使用文件对象的name属性拿到文件名,file属性拿到文件的字节流数据
再搞一个路由
由于路由用的是upload_file1,所以前端form的地址也要改一下
开启服务后我们访问/upload_file1
点击选择文件,我们选择django.png这个图像,然后点击打开
点击提交
出现上传成功
在media文件夹中可以找到上传的图像
方案1会出现文件名重名的问题,具体怎么解决看需求,可以不以file.name的名称存入,比如你可以用 用户名_file.name的命名方式,这个看需求
4.2 方案二
方案二要借助模型层(数据库),我们先搞一个应用
注册应用
在upload的model.py建表
- upload_to的属性值是子目录的名称,可以不给
生成迁移文件并迁移
- WARNINGS是搞缓存时留下来的warning,与文件上传无关
迁移后可以看一下mysql表的情况
发现类型是100长度的varchar
视图的部分只需要把文件放入表中
搞一个路由
由于路由的变化form的action也要发生变化
使用方式与方式一相同
提交后显示上传成功
上传的文件会放在media下模型类定义的子文件夹中
方案二不会出现重名的问题,现在我们再次上传相同文件名的图像
上传后会给相同文件名的文件加上尾缀乱码
回到mysql中看一下,发现定义的字段内容为文件的相对路径
5 访问上传文件
存在固定的位置,如果在前端界面就可以通过数据库拿到具体是哪个文件,然后把文件展示出来,如果仅仅想要获取,与static文件使用方式相同,访问media加具体文件名就可以找到了