SpringBoot 文件上传和下载的实现源码

时间:2022-09-11 23:42:02

本篇文章介绍springboot的上传和下载功能。

一、创建springboot工程,添加依赖

?
1
2
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")

工程目录为:

SpringBoot 文件上传和下载的实现源码

application.java 启动类

?
1
2
3
4
5
6
7
8
9
10
package hello;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.boot.context.properties.enableconfigurationproperties;
@springbootapplication
public class application {
  public static void main(string[] args) {
    springapplication.run(application.class, args);
  }
}

二、创建测试页面

在resources/templates目录下新建uploadform.html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html xmlns:th="http://www.thymeleaf.org">
<body>
  <div th:if="${message}">
    <h2 th:text="${message}"/>
  </div>
  <div>
    <form method="post" enctype="multipart/form-data" action="/">
      <table>
        <tr><td>file to upload:</td><td><input type="file" name="file" /></td></tr>
        <tr><td></td><td><input type="submit" value="upload" /></td></tr>
      </table>
    </form>
  </div>
  <div>
    <ul>
      <li th:each="file : ${files}">
        <a th:href="${file}" rel="external nofollow" th:text="${file}" />
      </li>
    </ul>
  </div>
</body>
</html>

三、新建storageservice服务

storageservice接口 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package hello.storage;
import org.springframework.core.io.resource;
import org.springframework.web.multipart.multipartfile;
import java.nio.file.path;
import java.util.stream.stream;
public interface storageservice {
  void init();
  void store(multipartfile file);
  stream<path> loadall();
  path load(string filename);
  resource loadasresource(string filename);
  void deleteall();
}

storageservice实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package hello.storage;
import org.springframework.core.io.resource;
import org.springframework.core.io.urlresource;
import org.springframework.stereotype.service;
import org.springframework.util.filesystemutils;
import org.springframework.util.stringutils;
import org.springframework.web.multipart.multipartfile;
import java.io.ioexception;
import java.net.malformedurlexception;
import java.nio.file.files;
import java.nio.file.path;
import java.nio.file.paths;
import java.nio.file.standardcopyoption;
import java.util.function.predicate;
import java.util.stream.stream;
@service
public class filesystemstorageservice implements storageservice
{
  private final path rootlocation = paths.get("upload-dir");
  /**
   * 保存文件
   *
   * @param file 文件
   */
  @override
  public void store(multipartfile file)
  {
    string filename = stringutils.cleanpath(file.getoriginalfilename());
    try
    {
      if (file.isempty())
      {
        throw new storageexception("failed to store empty file " + filename);
      }
      if (filename.contains(".."))
      {
        // this is a security check
        throw new storageexception("cannot store file with relative path outside current directory " + filename);
      }
      files.copy(file.getinputstream(), this.rootlocation.resolve(filename), standardcopyoption.replace_existing);
    }
    catch (ioexception e)
    {
      throw new storageexception("failed to store file " + filename, e);
    }
  }
  /**
   * 列出upload-dir下面所有文件
   * @return
   */
  @override
  public stream<path> loadall()
  {
    try
    {
      return files.walk(this.rootlocation, 1) //path -> !path.equals(this.rootlocation)
          .filter(new predicate<path>()
          {
            @override
            public boolean test(path path)
            {
              return !path.equals(rootlocation);
            }
          });
    }
    catch (ioexception e)
    {
      throw new storageexception("failed to read stored files", e);
    }
  }
  @override
  public path load(string filename)
  {
    return rootlocation.resolve(filename);
  }
  /**
   * 获取文件资源
   * @param filename 文件名
   * @return resource
   */
  @override
  public resource loadasresource(string filename)
  {
    try
    {
      path file = load(filename);
      resource resource = new urlresource(file.touri());
      if (resource.exists() || resource.isreadable())
      {
        return resource;
      }
      else
      {
        throw new storagefilenotfoundexception("could not read file: " + filename);
      }
    }
    catch (malformedurlexception e)
    {
      throw new storagefilenotfoundexception("could not read file: " + filename, e);
    }
  }
  /**
   * 删除upload-dir目录所有文件
   */
  @override
  public void deleteall()
  {
    filesystemutils.deleterecursively(rootlocation.tofile());
  }
  /**
   * 初始化
   */
  @override
  public void init()
  {
    try
    {
      files.createdirectories(rootlocation);
    }
    catch (ioexception e)
    {
      throw new storageexception("could not initialize storage", e);
    }
  }
}

storageexception.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package hello.storage;
public class storageexception extends runtimeexception {
  public storageexception(string message) {
    super(message);
  }
  public storageexception(string message, throwable cause) {
    super(message, cause);
  }
}
storagefilenotfoundexception.java
package hello.storage;
public class storagefilenotfoundexception extends storageexception {
  public storagefilenotfoundexception(string message) {
    super(message);
  }
  public storagefilenotfoundexception(string message, throwable cause) {
    super(message, cause);
  }
}

四、controller创建

将上传的文件,放到工程的upload-dir目录,默认在界面上列出可以下载的文件。

listuploadedfiles函数,会列出当前目录下的所有文件

servefile下载文件

handlefileupload上传文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package hello; 
 
 
import java.io.ioexception;
import java.util.stream.collectors;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.core.io.resource;
import org.springframework.http.httpheaders;
import org.springframework.http.responseentity;
import org.springframework.stereotype.controller;
import org.springframework.ui.model;
import org.springframework.web.bind.annotation.exceptionhandler;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.pathvariable;
import org.springframework.web.bind.annotation.postmapping;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.bind.annotation.responsebody;
import org.springframework.web.multipart.multipartfile;
import org.springframework.web.servlet.mvc.method.annotation.mvcuricomponentsbuilder;
import org.springframework.web.servlet.mvc.support.redirectattributes;
import hello.storage.storagefilenotfoundexception;
import hello.storage.storageservice;
@controller
public class fileuploadcontroller {
  private final storageservice storageservice;
  @autowired
  public fileuploadcontroller(storageservice storageservice) {
    this.storageservice = storageservice;
  }
  @getmapping("/")
  public string listuploadedfiles(model model) throws ioexception {
    model.addattribute("files", storageservice.loadall().map(
        path -> mvcuricomponentsbuilder.frommethodname(fileuploadcontroller.class,
            "servefile", path.getfilename().tostring()).build().tostring())
        .collect(collectors.tolist()));
    return "uploadform";
  }
  @getmapping("/files/{filename:.+}")
  @responsebody
  public responseentity<resource> servefile(@pathvariable string filename) {
    resource file = storageservice.loadasresource(filename);
    return responseentity.ok().header(httpheaders.content_disposition,
        "attachment; filename=\"" + file.getfilename() + "\"").body(file);
  }
  @postmapping("/")
  public string handlefileupload(@requestparam("file") multipartfile file,
      redirectattributes redirectattributes) {
    storageservice.store(file);
    redirectattributes.addflashattribute("message",
        "you successfully uploaded " + file.getoriginalfilename() + "!");
    return "redirect:/";
  }
  @exceptionhandler(storagefilenotfoundexception.class)
  public responseentity<?> handlestoragefilenotfound(storagefilenotfoundexception exc) {
    return responseentity.notfound().build();
  }
}

源码下载:https://github.com/hellokittynii/springboot/tree/master/springbootuploadanddownload

总结

以上所述是小编给大家介绍的springboot 文件上传和下载的实现源码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://blog.csdn.net/u010889616/article/details/79764175