美文网首页
Uploading Files

Uploading Files

作者: b7cda9616c52 | 来源:发表于2017-06-11 18:10 被阅读98次

    如果不知道如何使用 Spring,请先查看 Building a RESTful Web Service

    官方文章地址:https://spring.io/guides/gs/uploading-files/

    实现示例:构造 Spring Boot 的网站程序,可上传文件。
    下载地址:

    git clone https://github.com/spring-guides/gs-uploading-files.git
    

    build.gradle 文件:

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE")
        }
    }
    
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'org.springframework.boot'
    
    jar {
        baseName = 'gs-uploading-files'
        version =  '0.1.0'
    }
    
    repositories {
        mavenCentral()
    }
    
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    dependencies {
        compile("org.springframework.boot:spring-boot-starter-thymeleaf")
        testCompile("org.springframework.boot:spring-boot-starter-test")
    }
    

    使用 Servlet 上传文件,需要注册 MultipartConfigElement(在 web.xml 中就是 <multipart-config>)。Spring 已经帮我们做好了一切。

    我们只需要启动 Application 就行了,Spring 会初始化 MultipartConfigElement,使其可上传文件。
    src/main/java/hello/Application.java:

    package hello;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

    创建上传文件控制类 FileUploadController

    package hello;
    
    import hello.storage.StorageFileNotFoundException;
    import hello.storage.StorageService;
    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.*;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import java.io.IOException;
    import java.util.stream.Collectors;
    
    @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();
        }
    
    }
    

    类被指定为 @Controller,Spring MVC 会将其视为路由。@GetMapping@PostMapping 用于指定方法所匹配的路由。
    在该例子中:

    • GET / 用于获取上传文件的列表并将其展现在 Thymeleaf 模板(就是标有xmlns:th="http://www.thymeleaf.org" 的 html)里。
    • GET /files/{filename} 用于加载已经上传的文件,在浏览器里使用带有 "Content-Disposition" 的 header 进行下载。
    • POST / 处理 multi-part 格式的 file 参数,并将其交给 StorageService 进行保存。

    创建一个 Thymeleaf template src/main/resources/templates/uploadForm.html 进行上传:

    <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}" th:text="${file}" />
                </li>
            </ul>
        </div>
    
    </body>
    </html>
    

    可通过配置文件 src/main/resources/application.properties 控制上传文件大小:

    spring.http.multipart.max-file-size=128KB
    spring.http.multipart.max-request-size=128KB
    

    spring.http.multipart.max-file-size 上传文件大小不能超过 128KB。
    spring.http.multipart.max-request-size multipart/form-data 请求大小不能 128KB。

    下面来让应用跑起来。
    src/main/java/hello/Application.java

    package hello;
    
    import hello.storage.StorageProperties;
    import hello.storage.StorageService;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    
    @SpringBootApplication
    @EnableConfigurationProperties(StorageProperties.class)
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @Bean
        CommandLineRunner init(StorageService storageService) {
            return (args) -> {
                storageService.deleteAll();
                storageService.init();
            };
        }
    }
    

    文章里的代码并不完整,可直接下载代码查看。

    相关文章

      网友评论

          本文标题:Uploading Files

          本文链接:https://www.haomeiwen.com/subject/mwghqxtx.html