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.jpg
        filename=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=uname
        user.icon='uploads/'+filename
        user.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),  # 文件上传more
    path('show2/<int:id>', showImg2, name='show2'),  # 显示图片more

    path('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 = uname
            user.icon =strs
            user.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、运行

 

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Shell脚本-bin/bash: 解释器错误: 没有那个文件或目录-完整路径执行-“/”引发的脑裂

引起该不适的一种可能以及解决方案&#xff0c;网上较多&#xff0c;比如&#xff1a; 但按以上方式操作&#xff0c;并经过查看&#xff0c;发现仍然未能解决问题。 因为两种方式执行&#xff0c;有一种能成功&#xff0c;有一种不能&#xff0c;刚开始未怀疑是文件问题&…

写实风格3D模型材质贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 写实3D模型的制作过程包括建模、材质贴图、灯光设置和渲染等步骤。首…

ViT的极简pytorch实现及其即插即用

先放一张ViT的网络图 可以看到是把图像分割成小块&#xff0c;像NLP的句子那样按顺序进入transformer&#xff0c;经过MLP后&#xff0c;输出类别。每个小块是16x16&#xff0c;进入Linear Projection of Flattened Patches, 在每个的开头加上cls token和位置信息&#xff0c;…

【软件测试】为bug而生

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…

【23.12.29期--Redis缓存篇】谈一谈Redis的集群模式

谈一谈Redis的集群模式 ✔️ 谈一谈Redis的集群模式✔️主从模式✔️ 特点✔️Redis主从模式Demo ✔️哨兵模式✔️Redis哨兵模式Demo✔️特点 ✔️Cluster模式✔️Redis Cluster模式Demo✔️特点 ✔️ 谈一谈Redis的集群模式 Redis有三种主要的集群模式&#xff0c;用于在分布…

电气产品外壳常用材质PA、PC、PBT、ABS究竟是什么?

在如今工业制造领域&#xff0c;各种改性塑料、复合材料以及轻质合金材料的运用日趋成熟。在电气领域&#xff0c;不同电气产品的外壳、组件材质采用不同材料&#xff0c;以同为科技&#xff08;TOWE&#xff09;电气产品为例&#xff0c;工业连接器系列产品采用PA6外壳材质、机…

【SD】一致性角色 - 表情差异生成 【1】

原理&#xff1a;通过segment 局部重绘 可以根据lora 产生面部表情图片 模型&#xff1a;sam_vit_h_4b8939.pth 导入图片到segment 开启&#xff1a;Enable GroundingDINO GroundingDINO Detection Prompt &#xff1a;输入 face 然后点击&#xff1a;Preview Segmentation …

如何文件从电脑传到iPhone,这里提供几个方法

本文介绍了如何使用Finder应用程序、iTunes for Windows、iCloud和谷歌照片将照片从Mac或PC传输到iPhone。 如何将照片从Mac传输到iPhone 如果你有一台Mac电脑&#xff0c;里面装满了你想转移到iPhone的照片&#xff0c;这是一件非常简单的事情。只需遵循以下步骤&#xff1a…

LIUNX进程程序替换

1.什么是程序替换 a.一个程序&#xff0c;只能执行自己的代码 b.如果想要一个程序执行&#xff0c;别的程序的代码呢&#xff1f; 我们就可以创建一个子进程&#xff0c;将这个子进程替换为我们想要执行的程序。 2.样例代码-----execl&#xff08;接口&#xff09; 返回值&…

跨进程通信 macOS XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…

交叉编译aarch64架构支持openssl的curl、libcurl

本文档旨在指导读者在x86_64平台上交叉编译curl和openssl库以支持aarch64架构。在开始之前&#xff0c;请确保您的系统环境已正确配置。 1. 系统环境准备 系统是基于Ubuntu 20.04 LTS&#xff0c;高版本可能会有问题。首页&#xff0c;安装必要的开发工具和库文件。打开终端并…

QML 怎么调用 C++ 中的内容?

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ 先说明一下测试环境 编译器&#xff1a;vs2017x64 开发环境&#xff1a;Qt5.12 这里主要是总结一下&#xff0c;怎么在…

Java——猫猫图鉴微信小程序(前后端分离版)

目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手&#xff0c;所以做了一个对自己来说可以完成的…

MFC随对话框大小改变同时改变控件大小

先看一下效果; 初始; 窗口变大,控件也变大; 二个也可以; 窗口变大,控件变大; 默认生成的对话框没有WM_SIZE消息的处理程序;打开类向导,选中WM_SIZE消息,对CxxxDlg类添加该消息的处理程序;默认生成的函数名是OnSize; 添加了以后代码中会有三处变化; 在对话框类的…

嵌入式SOC之通用图像处理之OSD文字信息叠加的相关实践记录

机缘巧合 机缘巧合下, 在爱芯元智的xx开发板下进行sdk的开发.由于开发板目前我拿到是当前最新的一版(估计是样品)&#xff0c;暂不公开开发板具体型号信息.以下简称板子 .很多优秀的芯片厂商,都会提供与开发板配套的完善的软件以及完善的技术支持(FAE)&#xff0c;突然觉得爱芯…

鸿蒙(HarmonyOS 3.1) DevEco Studio 3.1开发环境汉化

鸿蒙&#xff08;HarmonyOS 3.1&#xff09; DevEco Studio 3.1开发环境汉化 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、设置过程 打开IDE&#xff0c;在第一个菜单File 中找到Settings...菜单 在Setting...中找到Plugins…

VSCode远程开发配置

目录 概要远程开发插件安装开始连接SSH无密码登录开发环境配置 概要 现在很多公司都是直接远程到服务器上写代码&#xff0c;使用远程开发&#xff0c;可以在与生产环境相同的环境中开发、测试和部署代码&#xff0c;减少因环境不同而导致的问题。当下VSCode远程开发是支持的比…

用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

随着人工智能技术的迅猛发展&#xff0c;问答机器人在多个领域中展示了广泛的应用潜力。在这个信息爆炸的时代&#xff0c;许多领域都面临着海量的知识和信息&#xff0c;人们往往需要耗费大量的时间和精力来搜索和获取他们所需的信息。 在这种情况下&#xff0c;垂直领域的 A…

初识Sringboot3+vue3环境准备

环境准备 后端环境准备 下载JDK17https://www.oracle.com/java/technologies/downloads/#jdk17-windows 安装就下一步下一步,选择安装路径 配置环境 环境 JDK17、IDEA2021、maven3.5、vscode 后端 基础&#xff1a;javaSE&#xff0c;javaWeb、JDBC、SMM框架&#xff08;Spr…

Vscode新手安装与使用

安装与版本选择 VS Code 有两个不同的发布渠道&#xff1a;一个是我们经常使用的稳定版&#xff08;Stable&#xff09;&#xff0c;每个月发布一个主版本&#xff1b;另外一个发布渠道叫做 Insiders&#xff0c;每周一到周五 UTC 时间早上6点从最新的代码发布一个版本&#x…