本篇文章介绍springboot的上传和下载功能。
一、创建springboot工程,添加依赖
1
2
|
compile( "org.springframework.boot:spring-boot-starter-web" ) compile( "org.springframework.boot:spring-boot-starter-thymeleaf" ) |
工程目录为:
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