Django 文件上传(十二)

当 Django 处理文件上传时,文件数据最终会被放置在 request.FILES 。

查看文档:文件上传 | Django 文档 | Django

Django工程如下: 

 

创建本地存储目录

在static/应用目录下创建uploads目录用于存储接收上传的文件

 在settings.py 配置静态目录和上传目录

#指定静态文件路径
STATICFILES_DIRS=[BASE_DIR / 'static'
]#媒体文件本地存放路径 (如果是模块,则必须指定哦!!)
MEDIA_ROOT= BASE_DIR / 'App/static/uploads'

一、单个文件上传 

  1、models.py模型数据

from django.db import models# Create your models here.
#存放用户图片数据表
class UserModel(models.Model):#用户名name=models.CharField(max_length=100,unique=True)#图片icon=models.CharField(max_length=300)class Meta:db_table='user'verbose_name='用户表'verbose_name_plural=verbose_name

注意:迁移文件 

  2、upload.html页面

<body><h2>单个文件上传</h2><hr/><form action="" method="post" enctype="multipart/form-data">{% csrf_token %}<p>用户名:<input type="text" name="uname"/></p><p>头像:<input type="file" name="icon"/></p><p><button>上传图片</button></p></form>
</body>

注意:from表单上传文件需要加 enctype=”multipare/form-data”  必须是post请求。

3、views.py视图函数

#单个文件上传
def upload_1(request):if request.method=='GET':return  render(request,'upload.html')elif request.method=='POST':#获取文件上传数据uname=request.POST.get('uname')#获取文件icon=request.FILES.get('icon')#上传到本地#调用方法-#337791d7-8ae5-4d97-b0d8-17dcc71fd94f.jpgfilename=getUuidName()+icon.name[icon.name.rfind('.'):]#1.分段保存上传的路径file_path=os.path.join(settings.MEDIA_ROOT,filename)print(filename,file_path)#分段存入with open(file_path,'ab') as f:#循环for part in icon.chunks():f.write(part) #写入f.flush()  #清空缓存#2.将上传文件保存到数据表中user=UserModel()user.name=unameuser.icon='uploads/'+filenameuser.save()return render(request, 'upload.html')#通过uuid获取唯一的图片名
def getUuidName():return str(uuid.uuid4())  #随机生成名字#显示图片
def showImg(request,id):user= UserModel.objects.get(pk=id)return render(request, 'show.html',{'user':user})

4、urls.py路由

from django.contrib import admin
from django.urls import path
from App.views import *urlpatterns = [path('index/', index),  # 静态文件path('up1/', upload_1),  # 文件上传path('show/<int:id>', showImg, name='show'),  # 显示图片path('up2/', upload_2),  # 文件上传morepath('show2/<int:id>', showImg2, name='show2'),  # 显示图片morepath('admin/', admin.site.urls),
]

5、show.html 显示上传的图片

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>{%  load static %}<link rel="stylesheet" href="{% static 'css/show.css' %}">
</head>
<body><h2>显示图片</h2><hr/>{%  load static %}<p id="p">{{ user.name }}</p><p><img src="{% static user.icon %}"> </p>
</body>
</html>

6、运行

 

二、多个文件上传 

   1、uploadmore.html页面

<body><h2>多个文件上传</h2><hr/><form action="" method="post" enctype="multipart/form-data">{% csrf_token %}<p>用户名:<input type="text" name="uname"/></p>
{#         <p>头像:<input type="file" name="icon"/></p>#}{{ form }}<p><button>上传图片</button></p></form>
</body>

  2、views.py视图函数

#########################################################
#表单类
class FileUploadForm(forms.Form):files=forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple':True}))#多个文件上传
def upload_2(request):if request.method == 'POST':#获取表单类form=FileUploadForm(request.POST,request.FILES)#判断if form.is_valid():# 获取文件上传数据uname = request.POST.get('uname')# 获取文件icons = request.FILES.getlist('files')#保存多个文件名ll_names=[]#循环图片for file in icons:#处理上传文件handle_uploaded_file(file)#保存文件名ll_names.append('uploads/' + file.name)#列表转换成字符串strs = ','.join(ll_names)# 2.将上传文件保存到数据表中user = UserModel()user.name = unameuser.icon =strsuser.save()# print(ll_names, strs)return render(request, 'showmore.html')else:form = FileUploadForm()return render(request, 'uploadmore.html', {'form': form})def handle_uploaded_file(file):""" 文件保存处理 """filePath = os.path.join(settings.MEDIA_ROOT, file.name)# 保存文件with open(filePath, 'wb+') as fp:for info in file.chunks():fp.write(info)fp.flush()#显示图片
def showImg2(request,id):user= UserModel.objects.get(pk=id)return render(request, 'showmore.html',{'user':user})

3、自定义模板标签和过滤器

     文档:https://docs.djangoproject.com/zh-hans/4.0/howto/custom-template-tags/

from django.template import Library
register = Library()@register.filter(name="split")
def split(value, key):"""Returns the value turned into a list."""return value.split(key)

注意:必须重启服务器,自定义模板才生效!!

  4、showmore.html 显示上传的图片

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>{%  load static %}<link rel="stylesheet" href="{% static 'css/show.css' %}">
</head>
<body><h2>显示更多图片</h2><hr/>{%  load static %}<p id="p">{{ user.name }}</p>{# 开发服务器并不会自动重启 添加 templatetags 模块后,你需要重启服务器,这样才能在模板中使用 tags 和 filters。#}
{#    加载自定义模板#}
{% load myfilter %}{% with user.icon|split:"," as details %}{% for im in details %}<p><img src="{% static im %}"> </p>{% endfor %}{% endwith %}</body>
</html>

  5、运行

 

 

单个或多个文件上传,查看文档还是容易实现!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307127.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell 入门

视频 Shell概述 本次课程主要包含内容: Shell脚本入门Shell变量Shell内置命令Shell运算符与执行运算命令流程控制语句Shell函数Shell重定向Shell好用的工具, cut sed awk sort大厂常见企业面试题 Shell脚本入门 疑问 linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等…

项目零散记录

Ts托管 仅本项目禁用本地vscode内置的ts服务 提交代码前的检查 husky(哈士奇)工具&#xff08;是一个git hooks工具&#xff09; 1、安装 pnpm dlx husky-init && pnpm install安装的时候&#xff0c;出现如下报错 解决方案&#xff0c;需要先执行git init初始化…

前端图片适配不同屏幕方案

预备知识&#xff1a; 设备独立像素,以下图的iphone12 Pro为例&#xff0c;390*844表示的就是设备独立像素&#xff08;DIP&#xff09;,也可以理解为CSS像素 物理像素&#xff08;设备像素&#xff09;&#xff0c;就是屏幕的分辨率&#xff0c;显示屏就是由一个个物理像素…

NAS上使用docker+postgresql搭建私有云笔记joplin全终端适配

文章目录 前置条件步骤1&#xff1a;获取joplin的镜像步骤2&#xff1a;配置容器参数2.1 端口设置2.2环境变量设置&#xff08;配置数据库&#xff09; 步骤3. 启动服务端步骤4. 配置客户端4.1 下载客户端4.2 配置客户端同步 步骤5. 外网访问插件安装 通常我们都会用到印象笔记…

沙特电子签证照片尺寸要求及手机自拍制作方法介绍

Hey小伙伴们&#xff0c;准备去沙特阿拉伯旅行的朋友们注意啦&#xff01;沙特驻华大使馆对签证所需照片是有要求的&#xff0c;今天我要分享给大家的是关于沙特签证照片的尺寸和拍摄要求&#xff0c;让你的签证申请过程更加顺利哦&#xff01;此外&#xff0c;也教大家一种在家…

TSINGSEE青犀智能分析网关V4人体行为检测算法在视频监控中的应用

旭帆科技智能分析网关的算法十分繁多&#xff0c;其中可分为人体事件、车辆事件、环境事件、行为检测、着装检测等等&#xff0c;可覆盖绝大多数场景&#xff0c;如智慧校园、智慧工地、智慧景区等&#xff0c;今天小编就TSINGSEE青犀智能分析网关的行为检测算法和大家进行研讨…

海外媒体发稿:提高文章影响力的7个必知美联社发稿技巧-华媒舍

科学普及在当今社会中扮演着重要的角色&#xff0c;它的宗旨是向大众传递科学知识并提高科学素养。许多科普作家和科学传媒人员面临一个共同的问题&#xff0c;那就是如何撰写一篇具有影响力的科普文章。本文将介绍美联社发稿的7个必知技巧&#xff0c;帮助你提高科普文章的影响…

1 - 数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型

数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型 数据库服务概述构建mysql服务安装mysql软件包连接mysql服务器 修改密码 密码管理修改密码策略&#xff08;需要登陆&#xff09;破解数据库管理员root密码&#xff08;数据库服务处于运行状态但是root忘记了密…

26K star! 跨平台的开源AirDrop 替品

现在大家的设备都很多&#xff0c;平时在家里手机&#xff0c;电脑&#xff0c;平板之间怎么传文件&#xff1f;如果你是苹果党&#xff0c;那肯定AirDrop最方便。但是当你需要跨平台来传输内容时&#xff0c;怎么样能更方便呢&#xff1f;各种网盘们都需要网络&#xff0c;如果…

计算机网络复习2

物理层 文章目录 物理层通讯基础奈奎斯特定理香农定理编码与调制交换传输介质&#xff08;了解&#xff09;物理层设备 通讯基础 数据信号码元信源信道信宿单工通道&#xff1a;只有一个方向半双工通道&#xff1a;不能同时发送和接收全双工通道 奈奎斯特定理 规定&#xff…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解前言ShuffleNet_V2讲解四条实用指导思想G1:相等的通道宽度可以降低存储访问成本G2:大量的分组卷积…

c 语言, 随机数,一个不像随机数的随机数

c 语言&#xff0c; 随机数&#xff0c;一个不像随机数的随机数 使用两种方式获取随机数&#xff0c;总感觉使用比例的那个不太像随机数。 方法一&#xff1a; rand() 获取一个随机数&#xff0c;计算这个随机数跟最大可能值 RAND_MAX&#xff08;定义在 stdlib.h 中&#xf…