【外卖系统】文件上传与下载

文件上传

文件上传又称upload,将本地图片、视频等文件上传到服务器上,供其他用户下载或者浏览。

form表单:HTML中的form元素用于创建一个包含表单字段的区域,用户可以在该区域输入数据,并通过提交表单将数据发送到服务器进行处理。表单是Web应用中收集用户输入的主要方式之一。
form元素包含了一个或多个表单字段,如输入框、复选框、单选按钮、下拉列表等,这些字段用于接受用户输入。每个表单字段都有一个相关的名字(name)和值(value)。当用户提交表单时,浏览器会将表单字段的名字和值一并发送到服务器。 form元素的常用属性包括: - action:指定表单提交的目标URL,即处理表单数据的服务器端脚本; - method:指定表单提交的HTTP方法,常用的有GET和POST; - enctype:指定表单数据的编码方式,常用的有application/x-www-form-urlencoded和multipart/form-data; - target:指定表单提交后处理结果的展示方式,如在当前窗口打开或在新窗口打开。
用户在填写表单字段后,可以点击提交按钮将数据发送到服务器。提交按钮通常使用input元素的type属性为"submit"来创建。用户点击提交按钮后,浏览器会将表单字段的名字和值封装成一个HTTP请求,并发送到服务器。服务器端的脚本可以通过读取这些字段的名字和值来处理用户提交的数据。
通过使用form元素,开发者可以创建各种类型的表单,用于收集用户输入的数据,并将数据发送到服务器进行处理和存储。

文件上传时的要求:

  • post方式提交数据,method=“post”
  • multipart格式上传文件,enctype=“multipart/form-data”
  • 使用input的file控件上传,type=file
    Spring框架在spring-web包中对文件上传进行了封装,只需在Controller的方法中声明一个MuitipartFile类型的参数即可接收上传的文件

代码实现

前端
在这里插入图片描述后台
在这里插入图片描述后台方法中的参数名file需要和前端中的对应,不能随意命名。

 /*** 文件上传* @param file* @return*/@PostMapping("/upload")public R<String> upload(MultipartFile file){//file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除log.info(file.toString());try{//将临时文件转存到指定位置file.transferTo((new File("D:\\hello.jpg")));}catch (IOException e){e.printStackTrace();}return null;}

可以看到是转存成功的
在这里插入图片描述将固定的转存地址改为动态的,程序可配置的
在这里插入图片描述

在这里插入图片描述具体代码如下:需要修改.yml文件的配置

server:port: 8060 #配置时 tomcat的端口号spring:application:name: my_reggie #应用的名称 可以自定义#datasource:#  druid:#    driver-class-name: com.mysql.cj.jdbc.Driver#    url: jdbc:mysql://localhost:3306/ruiji?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true#    username: root#    password: 333shardingsphere:datasource:names:master,slave# 主库(增删改操作)master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/reggie?characterEncoding=utf-8username: rootpassword: 111111# 从数据源(读操作)slave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/reggie?characterEncoding=utf-8username: rootpassword: 111111masterslave:# 读写分离配置load-balance-algorithm-type: round_robin #轮询(如果有多个从库会轮询着读)# 最终的数据源名称name: dataSource# 主库数据源名称master-data-source-name: master# 从库数据源名称列表,多个逗号分隔slave-data-source-names: slaveprops:sql:show: true #开启SQL显示,默认falsemain:allow-bean-definition-overriding: trueredis:host: localhost # 本地IP 或是 虚拟机IPport: 6379#    password: rootdatabase: 0  # 默认使用 0号dbcache:redis:time-to-live: 1800000  # 设置缓存数据的过期时间,30分钟mybatis-plus:configuration:#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,开启按照驼峰命名法映射map-underscore-to-camel-case: true #将以下划线作分隔符的部分 换成大写字母log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: ASSIGN_ID#自定义的文件上传存储位置
#takeOutFile:# fileLocaltion: D:\my_reggie\takeOutUploadFile#视频里面的路径
reggie:path: D:\
 @PostMapping("/upload")public R<String> upload(MultipartFile file){//file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除log.info(file.toString());try{//将临时文件转存到指定位置file.transferTo(new File(basePath + "hello.jpg"));}catch (IOException e){e.printStackTrace();}return null;}

改转换后图片的名字:改成原始的文件名
在这里插入图片描述在这里插入图片描述

@PostMapping("/upload")public R<String> upload(MultipartFile file){//file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除log.info(file.toString());//原始文件名String originalFilename = file.getOriginalFilename();try{//将临时文件转存到指定位置file.transferTo(new File(basePath + originalFilename));}catch (IOException e){e.printStackTrace();}return null;}

为了防止命名重复又改成了随机命名
在这里插入图片描述

public class CommonController {@Value("${reggie.path}")private String basePath;/*** 文件上传* @param file* @return*/@PostMapping("/upload")public R<String> upload(MultipartFile file){//file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除log.info(file.toString());//原始文件名String originalFilename = file.getOriginalFilename();String suffix =  originalFilename.substring(originalFilename.lastIndexOf("."));//使用UUID重新生成文件名,防止文件名称重复造成的文件覆盖String fileName = UUID.randomUUID().toString()+suffix;try{//将临时文件转存到指定位置file.transferTo(new File(basePath + fileName));}catch (IOException e){e.printStackTrace();}return null;}

http://localhost:8060/backend/page/demo/upload.html
存到一个指定文件夹下:

  //创建目录对象File dir = new File(basePath);//判断当前目录是否存在if(!dir.exists()){dir.mkdirs();}

在这里插入图片描述添加返回值

return R.success(fileName);

文件下载

文件下载又称download,将文件从服务器传到本地计算机

代码实现

通过输出流向浏览器页面写回数据

/*** 文件下载* @param name* @param response*/@GetMapping("/download")public void download(String name,HttpServletResponse response){//输入流 通过输入流读取文件内容try {FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));//输出流 通过输出流文件写回浏览器 在浏览器展示图片ServletOutputStream outputStream = response.getOutputStream();response.setContentType("image/jpeg");int len = 0;byte[] bytes = new byte[1024];while((len = fileInputStream.read(bytes)) != -1){outputStream.write(bytes,0,len);outputStream.flush();}//关闭资源outputStream.close();fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}

在这里插入图片描述

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

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

相关文章

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端实现 2.1 判断是否能进行拖拽 2.2 收集受影响的节点&#xff0c;提交给服务器 三、后端实现 四、总结 一、总述 这个拖拽功能对于这种树形的列表&#xff0c;整体的搬迁是很方便的。但是其实现却并不是那么的简单。 …

618技术揭秘 - 大促弹窗搭投实践 | 京东云技术团队

背景 618 大促来了&#xff0c;对于业务团队来说&#xff0c;最重要的事情莫过于各种大促营销。如会场、直播带货、频道内营销等等。而弹窗作为一个极其重要的强触达营销工具&#xff0c;通常用来渲染大促氛围、引流主会场、以及通过频道活动来提升频道复访等。因此&#xff0…

基于正交滤波器组的语音DPCM编解码算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................................g0zeros(1,lenH); g1zeros(1,l…

【Git系列】分支操作

&#x1f433;分支操作 &#x1f9ca;1. 什么是分支&#x1f9ca;2. 分支的好处&#x1f9ca;3. 分支操作&#x1fa9f;3.1 查看分支&#x1fa9f;3.2 创建分支&#x1fa9f;3.3 切换分支 &#x1f9ca;4. 分支冲突&#x1fa9f;4.1 环境准备&#x1fa9f;4.2 分支冲突演示 &am…

汽车产业链面临重大变革 大运乘用车加强产业布局 助力低碳出行

当前&#xff0c;国家“双碳”战略的全面实施&#xff0c;全球绿色产业发展理念的不断加深以及汽车产品形态、交通出行模式、能源消费结构变革所呈现的发展机遇等诸多因素&#xff0c;持续推动新能源汽车产业全面转型提速。据悉&#xff0c;2022年&#xff0c;中国新能源汽车销…

【Golang 接口自动化00】为什么要用Golang做自动化?

目录 为什么使用Golang做自动化 最终想实现的效果 怎么做&#xff1f; 写在后面 资料获取方法 为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后&#xff0c;因为没有太多时间和项目来实践&#xff0c;怕止步于此、步Java缺少练习遗忘殆尽的后尘&#xff0c;决定…

Docker 镜像解密:分层存储与镜像构建原理

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

2353. 设计食物评分系统;1895. 最大的幻方;842. 将数组拆分成斐波那契序列

2353. 设计食物评分系统 核心思想&#xff1a;首先明确我们有哪些功能&#xff0c;首先是修改某种食物分数的功能&#xff0c;然后第二点是能够每次弹出分数高字典序小的食物名字。由这两个我们想到了a 食物[分数],b 烹饪方式[分数&#xff0c;食物名字] 然后有一点经验的感…

Netty各组件基本用法、入站和出站详情、群聊系统的实现、粘包和拆包

Netty Bootstrap和ServerBootstrapFuture和ChannelFutureChannelSelectorNioEventLoop和NioEventLoopGroupByteBuf示例代码 Channel相关组件入站详情出站详情对象编解码ProtoBuf和ProtoStuffnetty实现群聊系统粘包和拆包TCP协议特点举个例子 Bootstrap和ServerBootstrap Boots…

css定义超级链接a标签里面的title的样式

效果: 代码: 总结:此css 使用于任何元素,不仅仅是a标签!

Redis如何实现排行榜?

今天给大家简单聊聊 Redis Sorted Set 数据类型底层的实现原理和游戏排行榜实战。特别简单&#xff0c;一点也不深入&#xff0c;也就 7 张图&#xff0c;粉丝可放心食用&#xff0c;哈哈哈哈哈~~~~。 1. 是什么 Sorted Sets 与 Sets 类似&#xff0c;是一种集合类型&#xff…

F5 LTM 知识点和实验 7-使用SNATs处理流量

第七章:使用SNATs处理流量 SNATs: 传统的vs都是对目的地址和端口进行改变,而源地址没有改变,如果你需要对源地址和源端口进行更改,则需要使用SNAT能力,好处在于: 1、允许不可路由地址(网络内部)的设备获得可路由地址以进入网络外部。2、确保目标服务器通过BIG-IP系统返…

Qt应用开发(基础篇)——QComboBox

目录 一、前言 二、属性和方法 三、信号 四&#xff1a;QFontComboBox 一、前言 QComboBox继承于QWidget&#xff0c;作为Qt Wdiget常用的控件&#xff0c;在实际开发中&#xff0c;经常用来作为某些特定参数属性的选择&#xff0c;比如语言、国家、字体、主题…

【Rust笔记】意译解构 Object Safety for trait

意译解构Object Safety for trait 借助【虚表vtable】对被调用成员函数【运行时内存寻址】的作法允许系统编程语言Rust模仿出OOP高级计算机语言才具备的【专用多态Ad-hoc Polymorphism】特性。 计算机高级语言中的“多态”术语是一个泛指。它通常可被细化为 基于继承关系的“子…

配置IPv6 over IPv4 GRE隧道示例

组网需求 如图1&#xff0c;两个IPv6网络分别通过SwitchA和SwitchC与IPv4公网中的SwitchB连接&#xff0c;客户希望两个IPv6网络中的PC1和PC2实现互通。 其中PC1和PC2上分别指定SwitchA和SwitchC为自己的缺省网关。 图1 配置IPv6 over IPv4 GRE隧道组网图 配置思路 要实现I…

Flyway——修改表名称与序列名称

文章目录 前言脚本修改表名称修改序列 前言 开发中一次偶然的机会&#xff0c;Oracle 12c 更换为 11g &#xff0c;需要对表名称的长度和序列长度做限制要求。 11g相对12c而言&#xff0c;表名称与序列名称的长度&#xff0c;不能超过30个字符。 在开发中做了更改&#xff0c;…

Tinkercad 建模21个小技巧

21个Tinkercad 建模小技巧 原文 参考文章&#xff1a;在 Tinkercad 中加快设计的 22 个技巧 一起来了解一下21个Tinkercad 3D建模小技巧&#xff0c;让你快人一步。 技巧1 Copy & Paste 文件&#xff0c;整合设计 想把文件A里面的模型拷贝到文件B里面&#xff1f; 很容…

找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决

找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决 安装相应的组件 项目——重定目标解决方案——然后选择版本

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

&#xfeff; 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Re…

【软件安装】MATLAB_R2021b for mac 安装

Mac matlab_r2021b 安装 下载链接&#xff1a;百度网盘 下载链接中所有文件备用。 我所使用的电脑配置&#xff1a; Macbook Pro M1 Pro 16512 系统 macOS 13.5 安装步骤 前置准备 无此选项者&#xff0c;自行百度 “mac 任何来源”。 1 下载好「MATLAB R2021b」安装文…