【web开发】11、文件的上传

2023-09-20 20:36:26

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



提示:以下是本篇文章正文内容,下面案例可供参考

一、文件上传

图片文件上传:在form 里添加 enctype=“multipart/form-data”
取值:request.POST和request.FILES

#upload_list.html
<div class="container">
        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="text" name="username">
            <input type="file" name="avatar">
            <input type="submit" value="提交">

        </form>
    </div>
def upload_list(request):
    if request.method == "GET":
        return render(request,'upload_list.html')
    # print(request.POST)
    # print(request.FILES)
    file_object = request.FILES.get("avatar")
    print(file_object.name)   #获取文件名

    f = open('a2.png',mode='wb')
    for chunk in file_object.chunks():
        f.write(chunk)  #写入到文件中
    f.close()
    return HttpResponse("...")

在这里插入图片描述

二、批量上传

1.安装openpyxl

pip install openpyxl

2.< input type=“file” name=“exc”>
file_object = request.FILES.get(“exc”)

#html
<div class="panel-heading">
                <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
                批量上传
</div>
<div class="panel-body">
     <form method="post" enctype="multipart/form-data" action="/depart/multi/">
          {% csrf_token %}
          <div class="form-group">
              <input type="file" name="exc">
          </div>
          <input type="submit" value="上传" class="btn btn-info btn-sm">
     </form>
</div>
# depart_multi
def depart_multi(request):
    """批量上传 (excel文件)  """
    #1.获取用户上传的文件对象
    file_object = request.FILES.get("exc")
    print(file_object)

    #2.对象传递给openpyxl,并从中读取文件内容
    from openpyxl import load_workbook
    wb = load_workbook(file_object)   #文件路径
    sheet = wb.worksheets[0]
    # cell =sheet.cell(1,1)
    # print(cell.value)
    #3.循环获取每一行数据
    for row in sheet.iter_rows(min_row=2):
        text = row[0].value
        print(text)
        models.Department.objects.create(title=text)
    return redirect("/depart/list/")
#py
def depart_multi(request):
    """批量上传 (excel文件)  """
    #1.获取用户上传的文件对象
    file_object = request.FILES.get("exc")
    print(file_object)

    #2.对象传递给openpyxl,并从中读取文件内容
    from openpyxl import load_workbook
    wb = load_workbook(file_object)   #文件路径
    sheet = wb.worksheets[0]
    # cell =sheet.cell(1,1)
    # print(cell.value)
    
    #3.循环获取每一行数据
    for row in sheet.iter_rows(min_row=2):
        text = row[0].value
        print(text)
        models.Department.objects.create(title=text)
    return redirect("/depart/list/")

在这里插入图片描述

三、案例:混合数据(form上传)

在这里插入图片描述
1.< form method=“post” enctype=“multipart/form-data” action=“/depart/multi/”>

#html
<form class="form-horizontal" method="post" novalidate>
	<form method="post" enctype="multipart/form-data" novalidate>
	 {% csrf_token %}
	 {% for field in form %}
	     <div class="form-group">
	         <div class="col-sm-offset-2 col-sm-10">
	             <label>{{ field.label }}</label>
	             {{ field }}
	             <span style="color: red">{{ field.errors.0 }}</span>
	         </div>
	     </div>
	 {% endfor %}
	 <div class="panel-heading col-sm-offset-2 col-sm-10" >
	     <form method="post" enctype="multipart/form-data" action="/depart/multi/">
	         <input type="submit" value="上传" class="btn btn-info btn-ms">
	     </form>
 	</div>
	</form>
</form>

2.img = forms.FileField(label=“头像”)
form = UpFOrm(data=request.POST,files=request.FILES)

from django import forms

class UpForm(BootstrapForm):
    bootstrap_exclude_fields = ['img']
    name = forms.CharField(label="姓名")
    age = forms.IntegerField(label="年龄")
    img = forms.FileField(label="头像")


import os
def upload_form(request):
    title="Form上传"
    if request.method == "GET":
        form = UpForm()
        return render(request,'upload_form.html',{"form":form,"title":title})
    form = UpForm(data=request.POST,files=request.FILES)
    if form.is_valid():
        #1.读取图片内容,写入到文件夹中并获取文件的路径
        image_object = form.cleaned_data.get("img")
        db_file_path = os.path.join("media",image_object.name)
        media_path = os.path.join("app01",db_file_path)

        f =open(media_path,mode='wb')
        for chunk in image_object.chunks():
            f.write(chunk)
        f.close()
        #2.将图片文件路径写入到数据库
        models.Boss.objects.create(
            name = form.cleaned_data['name'],
            age = form.cleaned_data['age'],
            img = media_path,

        )
        return HttpResponse("...")
    return render(request, 'upload_form.html', {"form": form, "title": title})

四、启用media

1.在urls.py中进行配置

re_path(r’^media/(?P< path>.*)$', serve, {‘document_root’: settings.MEDIA_ROOT},name=‘media’),

2.在settings.py中

import os
MEDIA_ROOT = os.path.join(BASE_DIR,“media”)
MEDIA_URL = “/media/”

五、案例:混合数据(Modelform上传)

在这里插入图片描述

1.models.py 定义city数据表

class City(models.Model):
    name = models.CharField(verbose_name="名称",max_length=32)
    count = models.IntegerField(verbose_name="人口")
    img = models.FileField(verbose_name="Logo",max_length=128,upload_to="city/")

2.定义ModelForm

from app01.utils.bootstrap import BootstrapModelForm

class UpModelForm(BootstrapModelForm):
    bootstrap_exclude_fields = ['img']
    class Meta:
        model = models.City
        fields = "__all__"

3.视图
GET:form =UpModelForm()
POST:form = UpModelForm(data=request.POST,files=request.FILES)

def upload_model_form(request):
    title = "ModelForm上传文件"
    if request.method == "GET":
        form =UpModelForm()
        return render(request,'upload_model_form.html',{"form":form,"title":title})
    form = UpModelForm(data=request.POST, files=request.FILES)
    if form.is_valid():
    #自动保存且存在数据库中
        form.save()
        return HttpResponse("成功")
    return render(request, 'upload_model_form.html', {"form": form, "title": title})

小结

  • 手动去写

file_object = request.FILES.get(“exc”)

  • Form组件(表单验证)
request.POST
file_object = request.FILES.get("exc")
...
  • Form组件(表单验证+自动保存数据库+自动保存文件)

media文件夹
models.py定义类文件要:
img = models.FileField(verbose_name=“Logo”,max_length=128,upload_to=“city/”)

更多推荐

conda init 导致的 powershell 启动缓慢的问题(Loading personal and system profiles took xxxx ms.)

文章目录一、问题描述二、问题溯源三、解决方案3.1测试3.2方案一:不在powershell中使用conda3.2方案二:需要时再在powershell中使用conda(推荐)四、powershell7特点一、问题描述powershell启动缓慢:每次启动都会加载很久的配置文件:Loadingpersonalandsy

【Python】conda虚拟环境下使用pyinstaller打包程序为exe

文章目录一、为什么要用conda虚拟环境二、pyinstaller用法2.1安装PyInstaller2.2基本用法打包一个Python脚本2.21打包一个Python项目2.22打包选项2.3打包依赖项2.31导出依赖项列表2.32配置依赖项2.4自定义打包选项2.5打包完成后的文件2.6注意事项三、打包示例一、为什

uni-app tree(树状) 组件

先看效果:组件代码:<template><viewclass="next-tree"><viewclass="next-tree-mask":class="{'show':showTree}"@tap="_cancel"></view><viewclass="next-tree-cnt":class="{'show':

QT-day1

实现华清远见登陆界面#include"mywnd.h"#include<iostream>#include<QDebug>#include<QPushButton>#include<QLineEdit>#include<QLabel>MyWnd::MyWnd(QWidget*parent):QWidget(parent

C#+sqlserver+asp.net婚纱影楼管理系统

一、源码描述这是一款简洁十分美观的ASP.NET+sqlserver源码,界面十分美观,功能也比较全面,比较适合作为毕业设计、课程设计、使用,感兴趣的朋友可以下载看看哦二、功能介绍该源码功能十分的全面,具体介绍如下:婚纱影楼管理系统实现了以下功能1:套系管理,影楼的管理人员可以管理自己所提供的套系信息2:员工管理,影楼

【QT】day4

闹钟头文件:#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QDebug>#include<QMouseEvent>//鼠标时间#include<QPaintEvent>//绘制时间#include<QPainter>//画家时间#include<QPix

优秀的golang开源框架

Web框架:Gin:高性能的Web框架,适用于构建RESTfulAPI和Web应用。Echo:快速和灵活的Web框架,适合构建微服务。Beego:全功能的Web框架,包括ORM、模板引擎等。Revel:全栈Web框架,提供了丰富的功能集。数据库ORM:GORM:强大的对象关系映射库,支持多种数据库。XORM:简单而强大

滚雪球学Java(30):多维数组:定义和初始化一次搞定

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!前言在前面的学习中,我们已经了解了Java数组的定义和操作,但是在实际开发中,我们往往需要用到多维数组来存储数据。在本文中,我们将学习如何定义和初始化多维数组。摘要本文将介绍

python+nodejs+php+springboot+vue 导师双选系统

为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的导师功能如下。导师管理导师选择信息,管理项目,管理项目提交并对学员提交的项目进行指导。为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的学员功能如下。学员选择导师,查看项目,提交已完成的项目文件,查看导师对项目的指导信息。这部分内容在系统

华为OD机考算法题:分奖金

题目部分题目分奖金难度难题目说明公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获得距离*数字差值的奖金。如果遇不到比自己数字大的,就给自己分配随机数数量的奖

第五章:数组

一、一维数组1、一维数组定义方式一维数组定义的三种方式:①数据类型数组名[数组长度];②数据类型数组名[数组长度]={值1,值2...};注意:第二种方式中,如果{}内不足数组长度个数据,剩余数据用0补全③数据类型数组名[]={值1,值2...};总结:①数组名的命名规范与变量名命名规范一致,不要和变量重名;②数组中下

热文推荐