<div id="cnblogs_post_body"><div>一、pom文件依赖的添加</div>
<div>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<div>二、controller层</div>
<div>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #000000">@Controller
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> FileUploadController {
</span><span style="color: #0000ff">private</span><span style="color: #000000"> final StorageService storageService;
@Autowired
</span><span style="color: #0000ff">public</span><span style="color: #000000"> FileUploadController(StorageService storageService) {
</span><span style="color: #0000ff">this</span>.storageService =<span style="color: #000000"> storageService;
}
</span><span style="color: #008000">//</span><span style="color: #008000">展示上传过的文件</span>
@GetMapping(<span style="color: #800000">"</span><span style="color: #800000">/</span><span style="color: #800000">"</span><span style="color: #000000">)
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String listUploadedFiles(Model model) throws IOException {
model.addAttribute(</span><span style="color: #800000">"</span><span style="color: #800000">files</span><span style="color: #800000">"</span>, storageService.loadAll().map(path -><span style="color: #000000">
MvcUriComponentsBuilder.fromMethodName(FileUploadController.</span><span style="color: #0000ff">class</span>, <span style="color: #800000">"</span><span style="color: #800000">serveFile</span><span style="color: #800000">"</span><span style="color: #000000">, path.getFileName().toString())
.build().toString())
.collect(Collectors.toList()));
</span><span style="color: #0000ff">return</span> <span style="color: #800000">"</span><span style="color: #800000">uploadForm</span><span style="color: #800000">"</span><span style="color: #000000">;
}
</span><span style="color: #008000">//</span><span style="color: #008000">下载选定的上传的文件</span>
@GetMapping(<span style="color: #800000">"</span><span style="color: #800000">/files/{filename:.+}</span><span style="color: #800000">"</span><span style="color: #000000">)
@ResponseBody
</span><span style="color: #0000ff">public</span> ResponseEntity<Resource><span style="color: #000000"> serveFile(@PathVariable String filename) {
Resource file </span>=<span style="color: #000000"> storageService.loadAsResource(filename);
</span><span style="color: #0000ff">return</span><span style="color: #000000"> ResponseEntity
.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, </span><span style="color: #800000">"</span><span style="color: #800000">attachment; filename=\"</span><span style="color: #800000">"</span>+file.getFilename()+<span style="color: #800000">"</span><span style="color: #800000">\"</span><span style="color: #800000">"</span><span style="color: #000000">)
.body(file);
}
</span><span style="color: #008000">//</span><span style="color: #008000">上传文件</span>
@PostMapping(<span style="color: #800000">"</span><span style="color: #800000">/</span><span style="color: #800000">"</span><span style="color: #000000">)
</span><span style="color: #0000ff">public</span> String handleFileUpload(@RequestParam(<span style="color: #800000">"</span><span style="color: #800000">file</span><span style="color: #800000">"</span><span style="color: #000000">) MultipartFile file,
RedirectAttributes redirectAttributes) {
storageService.store(file);
redirectAttributes.addFlashAttribute(</span><span style="color: #800000">"</span><span style="color: #800000">message</span><span style="color: #800000">"</span><span style="color: #000000">,
</span><span style="color: #800000">"</span><span style="color: #800000">You successfully uploaded </span><span style="color: #800000">"</span> + file.getOriginalFilename() + <span style="color: #800000">"</span><span style="color: #800000">!</span><span style="color: #800000">"</span><span style="color: #000000">);
</span><span style="color: #0000ff">return</span> <span style="color: #800000">"</span><span style="color: #800000">redirect:/</span><span style="color: #800000">"</span><span style="color: #000000">;
}
@ExceptionHandler(StorageFileNotFoundException.</span><span style="color: #0000ff">class</span><span style="color: #000000">)
</span><span style="color: #0000ff">public</span> ResponseEntity<?><span style="color: #000000"> handleStorageFileNotFound(StorageFileNotFoundException exc) {
</span><span style="color: #0000ff">return</span><span style="color: #000000"> ResponseEntity.notFound().build();
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<div>三、实现的service层</div>
<div>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #000000">@Service
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> FileSystemStorageService implements StorageService {
</span><span style="color: #0000ff">private</span><span style="color: #000000"> final Path rootLocation;
@Autowired
</span><span style="color: #0000ff">public</span><span style="color: #000000"> FileSystemStorageService(StorageProperties properties) {
</span><span style="color: #0000ff">this</span>.rootLocation = Paths.<span style="color: #0000ff">get</span><span style="color: #000000">(properties.getLocation());
}
@Override
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> store(MultipartFile file) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (file.isEmpty()) {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> StorageException(<span style="color: #800000">"</span><span style="color: #800000">Failed to store empty file </span><span style="color: #800000">"</span> +<span style="color: #000000"> file.getOriginalFilename());
}
Files.copy(file.getInputStream(), </span><span style="color: #0000ff">this</span><span style="color: #000000">.rootLocation.resolve(file.getOriginalFilename()));
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException e) {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> StorageException(<span style="color: #800000">"</span><span style="color: #800000">Failed to store file </span><span style="color: #800000">"</span> +<span style="color: #000000"> file.getOriginalFilename(), e);
}
}
@Override
</span><span style="color: #0000ff">public</span> Stream<Path><span style="color: #000000"> loadAll() {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
</span><span style="color: #0000ff">return</span> Files.walk(<span style="color: #0000ff">this</span>.rootLocation, <span style="color: #800080">1</span><span style="color: #000000">)
.filter(path </span>-> !path.equals(<span style="color: #0000ff">this</span><span style="color: #000000">.rootLocation))
.map(path </span>-> <span style="color: #0000ff">this</span><span style="color: #000000">.rootLocation.relativize(path));
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException e) {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> StorageException(<span style="color: #800000">"</span><span style="color: #800000">Failed to read stored files</span><span style="color: #800000">"</span><span style="color: #000000">, e);
}
}
@Override
</span><span style="color: #0000ff">public</span><span style="color: #000000"> Path load(String filename) {
</span><span style="color: #0000ff">return</span><span style="color: #000000"> rootLocation.resolve(filename);
}
@Override
</span><span style="color: #0000ff">public</span><span style="color: #000000"> Resource loadAsResource(String filename) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
Path file </span>=<span style="color: #000000"> load(filename);
Resource resource </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> UrlResource(file.toUri());
</span><span style="color: #0000ff">if</span>(resource.exists() ||<span style="color: #000000"> resource.isReadable()) {
</span><span style="color: #0000ff">return</span><span style="color: #000000"> resource;
}
</span><span style="color: #0000ff">else</span><span style="color: #000000"> {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> StorageFileNotFoundException(<span style="color: #800000">"</span><span style="color: #800000">Could not read file: </span><span style="color: #800000">"</span> +<span style="color: #000000"> filename);
}
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (MalformedURLException e) {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> StorageFileNotFoundException(<span style="color: #800000">"</span><span style="color: #800000">Could not read file: </span><span style="color: #800000">"</span> +<span style="color: #000000"> filename, e);
}
}
@Override
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> deleteAll() {
FileSystemUtils.deleteRecursively(rootLocation.toFile());
}
@Override
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> init() {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
Files.createDirectory(rootLocation);
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException e) {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> StorageException(<span style="color: #800000">"</span><span style="color: #800000">Could not initialize storage</span><span style="color: #800000">"</span><span style="color: #000000">, e);
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<div>四、在application.properties文件上配置上传的属性</div>
<div>
<div class="cnblogs_code">
<pre>spring.http.multipart.max-file-size=<span style="color: #000000">128KB
spring.http.multipart.max</span>-request-size=128KB</pre>
</div>
<div>五、服务启动时的处理</div>
<div><img src="http://images2017.cnblogs.com/blog/1190618/201708/1190618-20170801183357646-1632767289.png" alt="">
<div>六、测试成功的结果</div>
<div> </div>
<div> </div>
<div><img src="http://images2017.cnblogs.com/blog/1190618/201708/1190618-20170801183446396-1904400924.png" alt="">
<p> </p>
</div>
<div> </div>
</div>
</div>
</div>
</div>
</div></div><div id="MySignature"></div>