SpringMVC 文件上传和下载

文件上传

简单介绍:

文件上传是将文件从客户端读到服务器的过程。

pom.xml

如果是使用Spring5以及之前的版本需要引入依赖。

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.5</version>
</dependency>

文件上传表单

在文件上传之前我们需要准备一个html页面和一个表单来支持我们的文件上传。html页面采用thymeleaf模板语法。文件上传的请求必须是post,并且 form表单中必须使用标签entype="multipart/form-data"。文件上传的组件是input,该组件typefile,form表单中的action属性用来设置请求路径。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传和下载</title>
</head>
<body>
    <h1>文件上传和下载</h1>
    <hr>
    <h3>文件上传</h3>
    <!--文件上传表单-->
    <form th:action="@{/file/up}" method="post" enctype="multipart/form-data">
        点我上传:<input type="file" name="fileName"/><br>
        <input type="submit" value="上传">
    </form>
    <hr>
</body>
</html>

web.xml配置信息

Spring6需要在web.xml配置<multipart-config>标签信息,当然Spring5也是需要配置信息的,但是配置方式和Spring6不同。而是在springmvc.xml文件中配置:CommonsMultipartResolver,这个配置在Spring6中已经废弃。

<!--前端控制器-->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
        <!--设置单个支持最大文件的大小 单位字节-->
        <max-file-size>102400</max-file-size>
        <!--设置整个表单所有文件上传的最大值-->
        <max-request-size>102400</max-request-size>
        <!--设置最小上传文件大小-->
        <file-size-threshold>0</file-size-threshold>
    </multipart-config>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

编写文件上传响应的控制类(FileController)

文件上传的原理实际上还是IO流

package com.powernode;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

@Controller
public class FileController {

    // 处理文件上传请求
    @RequestMapping(value = "/file/up", method = RequestMethod.POST)
    public String fileup(@RequestParam("picturefile") MultipartFile file , HttpServletRequest httpServletRequest)  {

        // 获取上传文件的目录
        File directory= new File(httpServletRequest.getServletContext().getRealPath("/upload"));
       
        // 获取上传文件的原始文件名
        String orignname =  file.getOriginalFilename();
    
        // 如果目录不存在,则创建目录
        if(!directory.exists()){
           directory.mkdirs();
        }
        try(BufferedInputStream bufferedInputStream = new BufferedInputStream(file.getInputStream());
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(directory.getAbsolutePath()+"/"+orignname))
        ){
            // 读取文件内容,并写入到目标文件中
            int count ;
           byte[] bytes = new byte[1024];
            while((count=bufferedInputStream.read(bytes))!=-1){
                bufferedOutputStream.write(bytes,0,count);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    
        // 返回上传成功
        return "ok";
    }
}

使用UUID作为文件名,防止文件覆盖

@RequestMapping(value = "/file/up", method = RequestMethod.POST)
    public String fileup(@RequestParam("picturefile") MultipartFile file , HttpServletRequest httpServletRequest)  {
        File directory= new File(httpServletRequest.getServletContext().getRealPath("/upload"));

        String orignname =  file.getOriginalFilename();

        if(!directory.exists()){
           directory.mkdirs();
        }
        try(BufferedInputStream bufferedInputStream = new BufferedInputStream(file.getInputStream());
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(
                    directory.getAbsolutePath()+"/"+
                            UUID.randomUUID().toString()+orignname.substring(orignname.lastIndexOf("."))))
        ){
            int count ;
           byte[] bytes = new byte[1024];
            while((count=bufferedInputStream.read(bytes))!=-1){
                bufferedOutputStream.write(bytes,0,count);
            }
        }catch (IOException e){
            e.printStackTrace();
        }

        return "ok";
    }

文件下载

html部分代码:

<!--文件下载-->
<a th:href="@{/download}">文件下载</a>

controller代码:

  @GetMapping("/download")
    public ResponseEntity<byte[]> download(HttpServletRequest httpServletRequest) throws IOException {
        //获取要下载的文件
        File file = new File(httpServletRequest.getServletContext().getRealPath("/upload/10.png"));

        // 创建响应头对象
        HttpHeaders headers = new HttpHeaders();
        // 设置响应内容类型
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 设置下载文件的名称
        headers.setContentDispositionFormData("attachment", file.getName());
        
        // 返回结果
        return new ResponseEntity<>(Files.readAllBytes(file.toPath()), headers, HttpStatus.OK);
    }
posted @ 2024-07-11 16:35  BLBALDMAN  阅读(1)  评论(0编辑  收藏  举报