Spring Boot文件上传和下载

2022/4/21 6:19:55

本文主要是介绍Spring Boot文件上传和下载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. Spring Boot 文件上传

   1.1 创建springboot项目,引入web和thymeleaf启动器坐标

 

 

   1.2 编写文件上传的视图层thymeleaf页面。index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件上传和下载的页面</title>
</head>
<body>
    <form th:action="@{/fileUpload}" method="post" enctype="multipart/form-data">
        文件上传:<input type="file" name="file" />
        <input type="submit" value="提交" />
    </form>
</body>
</html>

   1.3 编写访问thymeleaf页面的控制器方法

      由于template目录是安全目录,该目录下所有的thymeleaf页面都不能直接访问,必须通过控制器才能访问。

@Controller
public class FileUpDownController {

    @RequestMapping("/{page}")
    public String path(@PathVariable String page){
        return page;
    }
}

1.4 编写实现控制文件上传的控制器方法

/**
 * 实现文件上传
 * @param file 上传的文件对象
 */
@RequestMapping("/fileUpload")
@ResponseBody
public String fileUpload(MultipartFile file){
    try {
        //path:目标目录
        File path=new File("src/main/resources/static/files");
        if(!path.exists()){
            path.mkdirs();
        }
        String oldName=file.getOriginalFilename();
        String fileName= UUID.randomUUID().toString().substring(0,18)+oldName.substring(oldName.lastIndexOf("."));
        //descFile:目标目录=文件夹名+文件名
        File descFile=new File(path.getAbsolutePath()+"/"+fileName);
        //将上传的文件保存到指定的目标目录下
        file.transferTo(descFile);
        return "文件上传成功";
    } catch (IOException e) {
        e.printStackTrace();
        return "文件上传失败";
    }
}

 1.5文件上传配置,全局配置文件application.properties

      默认spring boot 文件上传单个文件的大小为1MB

       默认spring boot 文件上传总文件的大小为10MB

#配置单个文件的最大大小
spring.servlet.multipart.max-file-size=20MB
#设置文件的总大小
spring.servlet.multipart.max-request-size=100MB

 

  1. Spring Boot 文件下载

   2.1 页面部分

<a th:href="@{/downLoad(filename='417f0b50-8dec-4b77-8a9c-73ff4a2b4cf9.jpg')}" >下载417f0b50-8dec-4b77-8a9c-73ff4a2b4cf9.jpg</a>
<a th:href="@{/downLoad(filename='27e8460b-1e75-4a16.sql')}" >下载sql</a>

  2.2 控制器实现文件下载

/**
 * 文件下载
 */
@RequestMapping("/downLoad")
public void downLoad(String filename, HttpServletResponse response){
    try {
        //根据文件名,找到目标目录下的文件
        File file=new File("src/main/resources/static/files/"+filename);
        //设置响应头,以附件的形式下载
        response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
        //将目标文件复制一份,通过response以流的形式输出
        IOUtils.copy(new FileInputStream(file),response.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

  1. Spring Boot 实现跨服务器文件上传

   3.1 结构图

 

 

 

   3.2 创建文件服务器,maven的web项目,存放上传的文件服务器

      项目名:fileupload_server

 

 

 

     在项目的webapp目录下,创建一个files的目录,存放上传的文件

      注意:往files中先默认放一张图片,否则files文件编译后不会保留

 

 

 

     项目发布到tomcat服务器上,并启动。注意修改端口和jmx

 

 

 

   3.3 创建实现文件上传的服务器,实现跨服务器文件上传的代码

       3.3.1 打开pom.xml文件,引入跨服务器的坐标

<!--跨服务器文件上传,引入jersey的相关坐标-->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.18.1</version>
</dependency>

      3.3.2 页面核心代码

<form th:action="@{/fileUpload2}" method="post" enctype="multipart/form-data">
    文件上传:<input type="file" name="file" />
    <input type="submit" value="提交" />
</form>

      3.3.3 application.properties配置文件

#上传的服务器的目标地址
server.file.path=http://localhost:9090/fileupload_server/files/

      3.3.4 控制器核心代码

@Value("${server.file.path}")
String path;
/**跨服务器的文件上传*/
@RequestMapping("/fileUpload2")
@ResponseBody
public String fileUpload2(MultipartFile file) throws IOException {
    System.out.println("跨服务器文件上传");
    //文件名
    String fileName=file.getOriginalFilename();
    //创建客户端对象
    Client client=Client.create();
    //和图片服务器建立连接
    WebResource webResource=client.resource(path+fileName);
    //上传文件到图片服务器
    webResource.put(file.getBytes());
    return "文件上传成功!";
}

3.3.4 测试,发现出现报错

 

  原因:

只要我们关联了服务器地址之后就可以直接通过put方法把文件上传上去,这无疑是非常危险的行为。因为在上传过程中并没有进行用户校验,那么如果被人知道了服务器保存图片的路径,甚至不需要知道准确路径,只要知道服务器ip地址就够了,那么他就可以通过put方法无限量的进行服务器上传。

如果开启了put方法,那么就可以任意写写入文件到服务器。但是如果禁用了put方法,那么又有导致一些需要put方法的业务无法使用.

修改tomcat的配置。修改在tomcat的/conf目录下的web.xml。找到下面这段把readonly设置成true。这样就无法通过put往服务器中写入文件了.

    解决:修改tomcat的web.xml文件设置为允许读写

<servlet>

        <servlet-name>default</servlet-name>

        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

        <init-param>

            <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

<!--允许读写-->

<init-param>

   <param-name>readonly</param-name>

            <param-value>false</param-value>

</init-param>

        <init-param>

            <param-name>listings</param-name>

            <param-value>false</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

</servlet>



这篇关于Spring Boot文件上传和下载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程