springMVC中的文件上传和下载

文章目录

10、文件上传和下载

10.1文件下载

ResponseEntity用于控制器方法的返回值的类型,该控制器方法的返回值就是响应到浏览器响应报文使用ResponseEntity实现下载文件的功能

java 复制代码
	@RequestMapping("/test/download")
    public ResponseEntity<byte[]> testDownload(HttpSession session) throws IOException {
        // 首先获取ServletContext对象
        ServletContext servletContext = session.getServletContext();
        // 获取服务器中文件的真实路径
        String realPath = servletContext.getRealPath("img");
        realPath = realPath + File.separator + "1.png";
        // 创建输入流
        InputStream inputStream = new FileInputStream(realPath);
        // 创建字节数组
        byte[] bytes = new byte[inputStream.available()];
        // 将输入流写入字节数组
        inputStream.read(bytes);
        // 设置响应头
        MultiValueMap<String, String> httpHeaders = new HttpHeaders();
        // 设置文件下载信息和文件名称
        httpHeaders.add("Content-Disposition", "attachment;filename=1.png");
        // 设置状态码
        HttpStatus httpStatus = HttpStatus.OK;
        // 创建 ResponseEntity 对象并返回
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, httpHeaders, httpStatus);
        // 关闭输入流
        inputStream.close();
        return responseEntity;
    }

10.2文件上传

引入依赖
xml 复制代码
        <!--        // 文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>
文件上传的要求:
  1. form表单的请求方式必须为post
  2. form表单必须设置属性enctype="multipart/form-data"
html 复制代码
    <form method="post" th:action="@{/test/upload}" enctype="multipart/form-data">
        头像:<input type="file" name="photo"><br>
        <input type="submit" value="上传">
    </form>

我这里用的是thymeleaf模板,如果你没有使用这个,直接用form表单也是可以的

服务器端的java代码

java 复制代码
@RequestMapping("/test/upload")
    public String testUpload(MultipartFile photo, HttpSession session) throws IOException {
        // 获取上传文件的名称
        String originalFilename = photo.getOriginalFilename();
        // 获取上传文件名的后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 获取uuid
        String uuid = UUID.randomUUID().toString();
        // 拼接一个新的文件名
        originalFilename = uuid + suffix;
        // 获取服务器中photo目录
        ServletContext servletContext = session.getServletContext();
        String photoPath = servletContext.getRealPath("photo");
        File file = new File(photoPath);
        if (!file.exists()) {
            file.mkdir();
        }
        String finalPath = photoPath + File.separator + originalFilename;
        photo.transferTo(new File(finalPath));
        return "success";

    }

.transferTo(new File(finalPath));

return "success";

复制代码
   }


**上面使用了UUID,UUID你可以直接理解成(UUID 只是一个值,您可以放心地将其视为唯一值。碰撞的风险是如此之低,以至于您可以合理地选择完全忽略它。)使用UUID的作用也就是生成一个不会重复的文件名,因为对于服务器而言,可能有很多很多的文件上传功能,如何都是一样的名字,那么就会对文件进行覆盖,这样,先上传的文件就会丢失**
相关推荐
SL_staff7 分钟前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A8 分钟前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊1 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊1 小时前
LeetCode2001~2020题目解析
java·leetcode
用户3721574261351 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java
叼烟扛炮2 小时前
Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘
linux·运维·服务器·网络·笔记·学习·php
SL_staff2 小时前
BI项目失败率90%?JVS如何用三阶闭环构建可落地的数据生产力平台
java·开源·全栈
叼烟扛炮2 小时前
Linux 学习笔记(五十一):数据链路层与 ARP 协议——局域网寻址与黑客骗局
linux·网络·网络协议·php·tcpdump
星恒随风3 小时前
Linux网络编程:彻底理解IO多路复用select!从fd_set位图、读写就绪到手写TCP多客户端字典服务器
linux·服务器·网络
nice_lcj5203 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal