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

chatgpt/2023/9/24 1:29:40

文件上传

文件上传又称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.exyb.cn/news/show-5313891.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

STM32使用HAL库中外设初始化MSP回调机制及中断回调机制详解

STM32使用HAL库之Msp回调函数 1.问题提出 在STM32的HAL库使用中&#xff0c;会发现库函数大都被设计成了一对&#xff1a; HAL_PPP/PPPP_Init HAL_PPP/PPPP_MspInit 而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字 上面的PPP/PPPP代表常见外设的名称为…

9.环境对象和回调函数

9.1环境对象 指的是函数内部特殊的变量this&#xff0c;它代表着当前函数运行时所处的环境 作用&#xff1a; 弄清楚this的指向&#xff0c;可以让我们代码更简洁 ➢函数的调用方式不同&#xff0c;this指代的对象也不同 ➢[谁调用&#xff0c;this 就指代谁] 是判断this指向的…

【C++】STL——vector的模拟实现、常用构造函数、迭代器、运算符重载、扩容函数、增删查改

文章目录 1.模拟实现vector1.1构造函数1.2迭代器1.3运算符重载1.4扩容函数1.5增删查改 1.模拟实现vector vector使用文章 1.1构造函数 析构函数 在C中&#xff0c;vector是一个动态数组容器&#xff0c;可以根据需要自动调整大小。vector类提供了几个不同的构造函数来创建和初…

【玩转Linux】Linux输入子系统简介

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

【Datawhale夏令营】任务三学习笔记

任务一笔记回顾 任务二笔记回顾 目录 一&#xff1a;竞赛上分流程 1.1问题建模1.2数据分析 1.3数据清洗1.4特征工程 1.5模型训练与验证 二&#xff1a;任务总结与心得 一&#xff1a;竞赛上分流程 问题建模——>数据分析 ——>数据清洗——>特征工程——>模型…

【C语言】通讯录2.0 (动态增长版)

前言 通讯录是一种记录联系人信息的工具&#xff0c;包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同&#xff0c;可以直接看第四章改造内容。 此通讯录是基于通讯录1.0&#xff08;静态版&#xff09;的基础上进行改进&#xff0c;请先看系列文字第…

HarmonyOS应用开发者基础与高级认证题库——中级篇

系列文章目录 HarmonyOS应用开发者基础与高级认证题库——基础篇 HarmonyOS应用开发者基础与高级认证题库——中级篇 文章目录 系列文章目录前言一、判断二、单选三、多选 前言 今天刚换了台果子手机就收到了华子鸿蒙开发认证邀请&#xff08;认证链接&#xff09;&#xff0…

[SSM]Spring6整合JUnit5与集成MyBatis3.5

目录 十七、Spring6整合JUnit5 17.1Spring对JUnit4的支持 17.2Spring对JUnit5的支持 十八、Spring6集成MyBatis3.5 18.1实现步骤 18.2具体实现 18.3spring配置文件的import 十七、Spring6整合JUnit5 17.1Spring对JUnit4的支持 准备工作&#xff1a; <dependencies&…
推荐文章