41.SpringMVC实现下载和上传功能

news2024/11/26 14:41:39

SpringMVC实现下载和上传功能

下载

ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文

index.html

	<a th:href="@{/testDown}">下载图片</a>

使用ResponseEntity实现下载文件的功能FileUpAndDownController.java

FileUpAndDownController.java

package com.atguigu.SpringMVC.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@Controller
public class FileUpAndDownController {
    @RequestMapping("/testDown")
    //ResponseEntity:作为控制器方法的返回值,表示相应到浏览器的完整响应报文
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        //获取ServletContext对象
        ServletContext servletContext = session.getServletContext();
        //获取服务器中文件的真实路径
        String realPath = servletContext.getRealPath("/static/img");
        //拼接(File.separator自动根据系统匹配拼接符)
        realPath = realPath + File.separator + "a.png";
        //创建输入流
        InputStream is = new FileInputStream(realPath);
        //创建字节数组
        byte[] bytes = new byte[is.available()];
        //将流读到字节数组中
        is.read(bytes);
        //创建HttpHeaders对象设置响应头信息
        MultiValueMap<String, String> headers = new HttpHeaders();
        //设置要下载方式以及下载文件的名字
        headers.add("Content-Disposition", "attachment;filename=a.png");
        //设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;
        //创建ResponseEntity对象
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
        //关闭输入流
        is.close();
        return responseEntity;
    }
}

运行结果:点击下载后–>可以成功下载并打开

上传

SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息

上传步骤:

  • 添加依赖:pom.xml

    •     <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
          <dependency>
              <groupId>commons-fileupload</groupId>
              <artifactId>commons-fileupload</artifactId>
              <version>1.3.1</version>
          </dependency>
      
  • 配置文件上传解析器:SpringMVC.xml

    •     <!--配置文件上传解析器-->
          <!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象-->
          <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
              <!--编码方式(默认为UTF-8)-->
              <property name="defaultEncoding" value="UTF-8"/>
          </bean>
      
  • 表单method必须为post

  • 属性enctype为浏览器向服务器传输请求参数的方式

    • application/x-www-form-urlencoded(默认):对于Get请求,将参数转换为key=value&key=value格式
    • multipart/form-data:以二进制的形式向服务传输数据
  • 设置文件域:<input type="file" name="photo">

最终的代码实现

index.html

    <form th:action="@{/testUp}" method="post" enctype="multipart/form-data">
        图片:<input type="file" name="photo"><br>
        <input type="submit" value="提交">
    </form>

FileUpAndDownController.java

    @RequestMapping("testUp")
    //和表单中name属性的值保持一致就会自动获取并赋值
    public String testUp(MultipartFile photo, HttpSession session) throws IOException {
        //获取所上传文件的文件名
        String fileName = photo.getOriginalFilename();
        //获取ServerContext对象
        ServletContext servletContext = session.getServletContext();
        //获取当前工程目录下的upImg目录的真实路径
        String photoPath = servletContext.getRealPath("upImg");
        //创建photoPath所对应的File对象
        File file = new File(photoPath);
        //判断file所对应的upImg目录是否存在
        if(!file.exists()){
            //没有则创建
            file.mkdir();
        }
        //最终上传路径(文件目录+分隔符+文件名称)
        String finalPath = photoPath + File.separator + fileName;
        //将文件上传到指定的位置
        photo.transferTo(new File(finalPath));
        return "success";
    }

解决上传文件重名问题

当上传的文件再次上传,因为默认的策略为不追加,而是进行覆盖,此时就会因为文件名相同的缘故而被覆盖掉

修改FileUpAndDownController.java

    @RequestMapping("testUp")
    //和表单中name属性的值保持一致就会自动获取并赋值
    public String testUp(MultipartFile photo, HttpSession session) throws IOException {
        //获取所上传文件的文件名
        String fileName = photo.getOriginalFilename();

        //解决重名问题
        //获取文件的后缀名(从最后一个"."开始截)
        String hzName = fileName.substring(fileName.lastIndexOf("."));
        //获取uuid
        String uuid = UUID.randomUUID().toString();
        //拼接一个新的文件名
        fileName = uuid + hzName;

        //获取ServerContext对象
        ServletContext servletContext = session.getServletContext();
        //获取当前工程目录下的upImg目录的真实路径
        String photoPath = servletContext.getRealPath("upImg");
        //创建photoPath所对应的File对象
        File file = new File(photoPath);
        //判断file所对应的upImg目录是否存在
        if(!file.exists()){
            //没有则创建
            file.mkdir();
        }
        //最终上传路径(文件目录+分隔符+文件名称)
        String finalPath = photoPath + File.separator + fileName;
        //将文件上传到指定的位置
        photo.transferTo(new File(finalPath));
        return "success";
    }

运行效果:

提交后的target目录变化:(文件会一直保存到此目录下,直到删除目录或者清除war包并重新部署)

以流的形式发送浏览器图片

PictureController.java

package com.atguigu.SSMConcordance.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

@RestController
public class PictureController {
    @GetMapping("/picture/{avatar}")
    public void avatar(@PathVariable String avatar, ServletOutputStream outputStream) throws IOException {
        //返回byte[]和void都可以,只要读取了文件流
        String os = System.getProperty("os.name");
        if (os.contains("Window"))
            avatar = "D:" + "/京东内存卡/壁纸/" + avatar + ".png";

        byte[] bytes = null;
        try {
            FileInputStream inputStream = new FileInputStream(new File(avatar));
            try {
                int len;
                bytes = new byte[1024];
                while ((len = inputStream.read(bytes)) != -1){
                    outputStream.write(bytes,0,len);
                    outputStream.flush();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                outputStream.close();
                inputStream.close();
            }
        }catch (FileNotFoundException e){
            System.out.println("文件未找到");
        }
        System.out.println("图片返回成功");
    }
}

python读取代码,也可以使用aipfox发送请求http://localhost:8080/SSMConcordance/picture/2

import urllib.request

# 直接下载
# urllib.request.urlretrieve(url='http://localhost:8080/SSMConcordance/picture/2', filename="2.png")

response = urllib.request.urlopen(url='http://localhost:8080/SSMConcordance/picture/2')

with open('2.png', 'wb') as fb:
    # 以二进制读取后写入
    fb.write(response.read())

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

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

相关文章

MCS-51单片机温度控制系统的设计

一、项目介绍 注塑机是一种常用的制造设备&#xff0c;用于生产塑料制品。在注塑机的工作过程中&#xff0c;溶胶必须达到一定的温度才能被注入模具中进行成型。因此&#xff0c;在注塑机的生产过程中&#xff0c;温度控制是非常重要的一环。 本项目基于MCS-51单片机设计了一…

关于TE,PU邀请函

有人问我说客户让办理TE邀请函&#xff0c;具体步骤是哪些&#xff1f;我目前还没遇到过客户要求办理TE邀请函的&#xff0c;基本上都是普通的商务签证&#xff0c;只要写个邀请函给客户&#xff0c;剩下的事情客户就能自己搞定&#xff0c;他们来访的目的简单&#xff0c;要么…

虹科方案|HK-Edgility利用边缘计算和VNF降本增效

一、边缘计算和 VNF 在当今瞬息万变的数字环境中&#xff0c;边缘虚拟化网络功能&#xff08;VNF&#xff09;是一个既能够优化网络基础设施&#xff0c;又能控制成本的创新型解决方案。它使客户能够将多个基于软件的 VNF 整合到一个专用计算设备上。更值得高兴的是&#xff0c…

【开发】视频集中存储/直播点播平台EasyDSS点播文件分类功能优化

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法&#xf…

LNMP架构搭建论坛

目录 一、LNMP简介&#xff1a; 二、LNMP搭建&#xff1a; 1.前提准备&#xff1a; 关闭防火墙和安全机制&#xff1a; 2.编译安装nginx&#xff1a; 3.编译安装mysql&#xff1a; 3.1 安装依赖环境&#xff1a; 3.2 创建mysql运行用户&#xff1a; 3.3 编译安装&#xff1a…

Vue.js核心技术深度解析与uni-app跨平台开发实战

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Vue.js是一款流行的Java…

算法训练day39|动态规划 part02(LeetCode62.不同路径、63. 不同路径 II)

文章目录 62.不同路径思路分析代码实现 63. 不同路径 II思路分析代码实现思考总结 62.不同路径 题目链接&#x1f525;&#x1f525; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步…

Lua语法结构

Lua基础 注释 print("hello.") -- 单行注释的写法 --[[ 多行注释的写法 --]]标识符 关键字 **and **break**do **else**elseif ****end **falsefor**function **ifinlocalnilnotorrepeatreturnthentrueuntil**while ** 数据类型 nil** boolean**** number**** st…

MyBatis-Plus排除不必要的字段

查询学生信息排除年龄列表 &#x1f4da;&#x1f50d; 使用MyBatis-Plus排除某些字段。如果你想要进行查询&#xff0c;但又不需要包含某些字段&#xff0c;那么这个功能将非常适合你。&#x1f50d;&#x1f393;&#x1f4dd; 1. 学生信息查询-排除年龄列表 在使用 MyBat…

Vue.js基础(一)

目录 1、{{ }} 文本插值 2、v-html原始html 3、v-bind Attribute&#xff08;属性&#xff09;绑定\三元运算符 4、v-for列表渲染 5、v-on监听事件 6、事件调用方法 7、v-model表单的输入绑定 8、Props组件交互 父传子 子传父 子传父总结 1、{{ }} 文本插值 <…

手写Spring:第3章-实现Bean的定义、注册、获取

文章目录 一、目标&#xff1a;实现Bean的定义、注册、获取二、设计&#xff1a;实现Bean的定义、注册、获取三、实现&#xff1a;实现Bean的定义、注册、获取3.1 工程结构3.2 实现Bean的定义、注册、获取类图3.3 定义Bean异常3.4 BeanDefinition定义和注册3.4.1 BeanDefinitio…

解决 Spring Boot 与 springfox 的 NullPointerException 问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

MRI多任务技术及应用

目录 一、定量心血管磁共振成像&#xff08;CMR&#xff09;的改进方法二、磁共振多任务三、磁共振多任务的成像框架四、磁共振多任务的图像模型和采样和重建策略五、利用MR多任务进行快速三维稳态CEST(ss-CEST)成像5.1 利用MR多任务进行快速三维稳态CEST(ss-CEST)成像介绍5.2 …

嵌入式学习笔记(14)位置有关编码

位置无关编码&#xff08;PIC,position independent code&#xff09;&#xff1a;汇编源文件被编码成二进制可执行程序时编码方式与位置&#xff08;内存地址&#xff09;无关。在我们写程序时&#xff0c;必须给链接器指定地址。将来的程序被执行时必须放在当时链接时给定的地…

iPhone照片导入电脑的绝佳教程,赶快get起来!

为什么都说苹果手机拍照比安卓手机好看&#xff1f;因为苹果手机拍照更加真实&#xff0c;其镜头和硬件能让照片更好地接近原始色彩。手机拍照好看就会让人忍不住多拍几张&#xff0c;久而久之手机内存就满了。有什么方法能将照片保存到电脑上吗&#xff1f;iPhone照片导入电脑…

《vue3实战》运用push()方法实现电影评价系统的添加功能

目录 前言 电影评价系统的添加功能是什么&#xff1f; 电影评价系统的添加功能有什么作用&#xff1f; 一、push&#xff08;&#xff09;方法是什么&#xff1f;它有什么作用&#xff1f; 含义&#xff1a; 作用&#xff1a; 二、功能实现 这段是添加开始时点击按钮使…

私募证券基金动态-23年8月报

成交量&#xff1a;8月日均8,252.00亿元 8月A股两市日均成交8,252.00亿元&#xff0c;环比下降12.23%、同比下降18.11%。8月整体23个交易日&#xff0c;仅有3个交易日单日成交金额过万亿&#xff0c;且成交量起伏较大&#xff0c;单日成交金额最低仅有6805.32亿元&#xff08;…

C# 实现电子签名

本项目基于Emgu.CV&#xff08;C#下OpenCv的封装&#xff09;开发的&#xff0c;编译器最新版Vs2022&#xff0c;编译环境x86 直接看效果图 1.主页面 2.我们先看手写的方式&#xff1a; 点击确认就到主界面&#xff0c;如下 &#xff1a; 点击自动适配-&#xff0c;再点击生成…

windows安装向量数据库milvus

本文介绍windows下安装milvus的方法。 一.Docker安装 1.1docker下载 首先到Docker官网上下载docker:Docker中文网 官网 1.2.安装前前期准备 先使用管理员权限打开windows powershell 然后在powershell里面输入下面那命令&#xff0c;启用“适用于 Linux 的 Windows 子系统”…

JMeter压力测试入门教程

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库&#xff0c; FTP服务器, 等等。J…