0


Spring Boot实现文件上传和下载

实现Spring Boot文件上传和下载的步骤:

1.文件上传

  • 在pom.xml文件中添加依赖:spring-boot-starter-webspring-boot-starter-thymeleaf
  • 创建一个上传前端的页面,包括一个表单来选择文件和一个提交按钮。
  • 在Controller中添加一个POST方法,该方法接受MultipartFile参数,将文件保存在服务器上。
  • 在application.properties文件中配置上传文件的最大大小和文件存储路径。

2.文件下载

  • 在Controller中添加一个GET方法,该方法接收一个文件名参数,通过ResponseEntity将文件内容返回给客户端。
  • 如果需要授权访问,则可以通过使用Spring Security实现基本身份验证。

以下是Spring Boot实现文件上传和下载的代码示例:

1.文件上传

  • pom.xml依赖配置:
<!-- 文件上传 -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency>

<!-- Servlet API -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>
  • 在配置文件中配置:# 开启上传和下载spring.servlet.multipart.enabled=true# 最大的文件大小spring.servlet.multipart.max-file-size=30MB# 单次最大请求大小spring.servlet.multipart.max-request-size=30MB# 自定义的上传文件存放路径file.upload.dir=e:/test

  • 在Controller中添加一个POST方法:

@PostMapping("/upload")@ResponseBodypublicStringupload(@RequestParam("file")MultipartFile file){if(file.isEmpty()){return"上传失败,请选择文件";}// 获取文件名String fileName = file.getOriginalFilename();// 获取文件的后缀名String suffixName = fileName.substring(fileName.lastIndexOf("."));// 上传后的路径String filePath ="D:/upload/";// 解决中文问题,liunx下中文路径,图片显示问题
    fileName =UUID.randomUUID()+ suffixName;// 构建上传路径File dest =newFile(filePath + fileName);// 检测是否存在目录if(!dest.getParentFile().exists()){
        dest.getParentFile().mkdirs();}try{// 保存文件
        file.transferTo(dest);return"上传成功";}catch(IllegalStateException e){
        e.printStackTrace();}catch(IOException e){
        e.printStackTrace();}return"上传失败";}

2.文件下载

  • 在Controller中添加一个GET方法:
@GetMapping("/download")publicResponseEntity<byte[]>download()throwsIOException{// 获取文件File file =newFile("D:/upload/1.jpg");// 构造响应HttpHeaders headers =newHttpHeaders();
    headers.setContentDispositionFormData("attachment", file.getName());
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);returnnewResponseEntity<>(FileUtils.readFileToByteArray(file), headers,HttpStatus.CREATED);}
编写Controller方法
@GetMapping("/download")publicvoiddownloadFile(HttpServletResponse response){try{//获取要下载的文件File file =newFile("file_path");//设置响应的内容类型为二进制流,即文件类型
        response.setContentType("application/octet-stream");//设置文件名
        response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));//创建输入流FileInputStream inputStream =newFileInputStream(file);BufferedInputStream buffInputStream =newBufferedInputStream(inputStream);//创建输出流ServletOutputStream outputStream = response.getOutputStream();BufferedOutputStream buffOutputStream =newBufferedOutputStream(outputStream);//循环读取数据并写入到响应输出流中byte[] buffer =newbyte[1024];int len =-1;while((len = buffInputStream.read(buffer))!=-1){
            buffOutputStream.write(buffer,0, len);}//关闭流
        buffOutputStream.flush();
        buffOutputStream.close();
        outputStream.flush();
        outputStream.close();
        buffInputStream.close();
        inputStream.close();}catch(Exception e){
        e.printStackTrace();}}
在SpringBoot中,我们可以通过以下步骤实现文件响应给浏览器实现下载:

在Controller中编写请求处理方法,并使用@GetMapping注解来指定该方法处理GET请求。

在方法中使用InputStreamResource将本地文件以流的形式读取到内存中。

使用ResponseEntity.ok()方法构造响应,并将之前获取到的InputStreamResource作为参数传入。

使用.header()方法设置响应头,包括Content-Disposition、Content-Type等信息。

以下是一个示例代码:

importorg.springframework.core.io.InputStreamResource;importorg.springframework.http.HttpHeaders;importorg.springframework.http.MediaType;importorg.springframework.http.ResponseEntity;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.GetMapping;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;@ControllerpublicclassFileDownloadController{@GetMapping("/download")publicResponseEntity<InputStreamResource>downloadFile()throwsIOException{String filename ="example.txt";InputStream is =newFileInputStream(filename);InputStreamResource resource =newInputStreamResource(is);HttpHeaders headers =newHttpHeaders();
        headers.add("Content-Disposition","attachment; filename=\""+ filename +"\"");
        headers.add("Cache-Control","no-cache, no-store, must-revalidate");
        headers.add("Pragma","no-cache");
        headers.add("Expires","0");returnResponseEntity.ok().headers(headers).contentLength(is.available()).contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);}}
其中,Content-Disposition头用于描述响应结果的类型,这里指定为attachment表示要下载的文件,filename表示文件名。

Cache-Control、Pragma、Expires头用于控制缓存的行为,这里设为不缓存。

最后将InputStreamResource对象作为响应体返回即可。

本文转载自: https://blog.csdn.net/qq_45525848/article/details/129344889
版权归原作者 北执南念 所有, 如有侵权,请联系我们删除。

“Spring Boot实现文件上传和下载”的评论:

还没有评论