29.文件上传

目录

1  前端

2  配置

3  路由

4  视图

4.1  方案一

4.2  方案二

5  访问上传文件


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加具体文件名就可以找到了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值