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


版权声明:本文为potato123232原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。