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再测。成功!

相关推荐
曹牧1 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法2 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7252 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎3 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄3 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds3 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹3 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚3 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Ro Jace4 小时前
计算机专业基础教材
java·开发语言