2.13 文件上传
下面是用springboot实现文件上传的例子,这是一个完整的eclipse项目,点击下载后导入,可直接运行。
文件上传后会保存在../../../upload-dir文件夹,启动前会清空这个文件夹内所有文件:
这个例子用到了网页模板,在file../../../uploadController.java里,listUploadfiles函数响应/file请求,返回../../../uploadForm:
@GetMapping("/file")
public String listUploadedFiles(Model model)throws IOException{
model.addAttribute("files",storageService
.loadAll()
.map(path->MvcUriComponentsBuilder
.fromMethodName(FileUploadController
.class,
"serveFile",path
.getFileName()
.toString()).build().toUri().toString()).collect(Collectors.toList()));
return "../../../uploadForm";
}
而实际上,这个../../../uploadForm是一个html模板,它位于src/main/rescources/templates文件夹里,upLoadForm.html:
<htmlxmlns:th="https://www.thymeleaf.org">
<body>
<divth:if="${message}">
<h2th:text="${message}"/>
</div>
<div>
<formmethod="POST"enctype="multipart/form-data"action="/file">
<table>
<tr>
<td>Fileto../../../upload:</td>
<td><inputtype="file"name="file"/>
</td>
</tr>
<tr>
<td></td>
<td><inputtype="submit"value="Upload"/>
</td>
</tr>
</table>
</form>
</div>
<div>
<ul>
<lith:each="file : ${files}"><ath:href="${file}"th:text="${file}"/>
</li>
</ul>
</div>
</body>
</html>
它是一个称为thymeleaf的框架,类似于前端的Vue,但是它是后端直接填数据的,为了使用它,需要在pom.xml的dependencies中添加这一行(项目里的已经添加):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
../../uploadForm.html里面的${message}和${file}就是属性,需要在java后台里设值,如果没有值,那么不会显示。上传成功后,会设值message属性的值:
@PostMapping("/file")
public String handleFileUpload(@RequestParam("file")MultipartFile file,RedirectAttributes redirectAttributes){
storageService.store(file);
redirectAttributes.addFlashAttribute("message","You successfully
../../uploaded "+file.getOriginalFilename()+"!");
return "redirect:/file";
}
message设置成了“You successfully ../../uploaded ”加上文件名,于是页面变成了这样:
最后,配置文件application.properties(位于src/main/rescources/)里限定了上传文件的最大值:
spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB