springMVC-13 文件下载及上传

文件下载-ResponseEntity<T>

说明

在SpringMVC中,通过返回ResponseEntity<T>的类型,可以实现文件下载的功能

核心代码:就是设置HttpHeader

文件下载响应头的设置

content-type 指示响应内容的格式

content-disposition 指示如何处理响应内容

一般有两种方式:

content-disposition:inline 以内联形式,直接在页面显示

content-disposition:attchment 以附件形式,下载

应用实例

1.准备要下载的文件,复制到,web/directory/Deepseek.png

2.添加链接,web/json.jsp

复制代码
<a href="<%=request.getContextPath()%>/json/download" >点击下载文件</a>

3.增加方法,com/stein/springMVC/json/handler/JsonHandler.java

复制代码
@RequestMapping("/download")
    @ResponseBody
    public ResponseEntity<byte[]> downloadFile(HttpSession session) {
        //1.获取资源的输入流
        InputStream resourceAsStream = session.getServletContext().getResourceAsStream("/directory/Deepseek.png");
        //2.设置读取资源的内存大小
        byte[] bytes;
        try {
            bytes = new byte[resourceAsStream.available()];
            //3.将资源读取到内存中去
            resourceAsStream.read(bytes);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //4.提供构造器的参数public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
        //bytes就是要传输的数据body
        //headers是传输报头
        HttpHeaders httpHeaders = new HttpHeaders();
        //设置传输内容,attachment表示以附件的形式进行下载,下载时的文件名我现在设置这个
        httpHeaders.add("Content-Disposition","attachment;filename=DeepseekCustom.jpg");

        //5.指定成功下载时的状态码
        HttpStatus httpStatus = HttpStatus.OK;

        //6.创建响应实体,并返回
        return new ResponseEntity<>(bytes, httpHeaders,HttpStatus.OK);

    }

4.测试。点击下载后,弹出另存为窗口

postman再测

因为postman没有解析jpg格式,所以显示的乱码。

文件上传

基本介绍

1.Spring MVC为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver实现的。

Spring用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:

CommonsMultipartResovler

2.Spring MVC上下文中默认没有装配MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用Spring的文件上传功能,需现在上下文中配置MultipartResolver

应用实例

1.引入jar包

2.创建web/upload.jsp

enctype:encodetype编码类型默i认是application/x-www-urlencoded即url编码这种编码不适二进制文件数据的提交,一般是适用文本

如果是要进行二进制文件的提交enctype要指定multipart/form-data表示表单提交的数据是有多个部分组成,也就是可以提交二进制数据和文本数据

复制代码
    <h1>文件上传</h1>
    <form action="<%=request.getContextPath()%>/upload" method="post" enctype="multipart/form-data">
        文件介绍:<input type="text" name="introduce"><br>
        选择文件:<input type="file" name="file"><br>
        <input type="submit" value="提交">
    </form>

3.配置文件上传解析器,web/WEB-INF/springMVC-servlet.xml

复制代码
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

4.创建com/stein/springMVC/upload/FileUploadHandler.java

复制代码
@Controller
public class FileUploadHandler {

    @RequestMapping("/upload")
    public String upload(@RequestParam("file")MultipartFile file,//设定好与前端一直的名称后,后面这个变量名file就可以随便改了
                         HttpServletRequest request,String introduce) throws IOException {
        String originalFilename = file.getOriginalFilename();
        System.out.println("上传文件的名字=" + originalFilename);

        System.out.println("introduce: " + introduce);

        //参数填什么?这儿是打算保存的路径,可以是根路径"/",也可以是全路径("/img/"+originalFilename)
        //要上传的文件保存的全路径
        String realPath = request.getServletContext().getRealPath("/");
        System.out.println("realPath = " + realPath);

        //上传文件的文件名。可以一步生成。
        // 注意:如果要创建img文件夹的话,要在web目录里面提前建好,同时检查out目录里面是否已经重构,否则上传会报错
        //String fileFullPath =request.getServletContext().getRealPath("/img/"+originalFilename);
        String fileFullPath = realPath + File.separator + originalFilename;
        System.out.println("fileFullPath = " + fileFullPath);
        File localFile = new File(fileFullPath);
        file.transferTo(localFile);
        return "success";
    }
}

5.测试

上传成功,success!

6.postman再测。成功!

相关推荐
专注API从业者43 分钟前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠1 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY1 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克32 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠3 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌3 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局3 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化
阿丰资源3 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
呱牛do it3 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 8)
java
消失的旧时光-19434 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解