SpringBoot上传任意文件功能的实现

			<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>

 

posted @ 2017-08-02 13:32  百度程序员  阅读(214)  评论(0)    收藏  举报