Browse Source

add about file

upload fille
spring boot and fastdfs
纯洁的微笑 7 years ago
parent
commit
705733ed45
20 changed files with 657 additions and 0 deletions
  1. 52 0
      spring-boot-fastDFS/pom.xml
  2. 30 0
      spring-boot-fastDFS/src/main/java/com/neo/FastDFSApplication.java
  3. 19 0
      spring-boot-fastDFS/src/main/java/com/neo/config/Configurations.java
  4. 20 0
      spring-boot-fastDFS/src/main/java/com/neo/controller/GlobalExceptionHandler.java
  5. 85 0
      spring-boot-fastDFS/src/main/java/com/neo/controller/UploadController.java
  6. 103 0
      spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSClient.java
  7. 70 0
      spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSFile.java
  8. 6 0
      spring-boot-fastDFS/src/main/resources/application.properties
  9. 9 0
      spring-boot-fastDFS/src/main/resources/fdfs_client.conf
  10. 24 0
      spring-boot-fastDFS/src/main/resources/logback.xml
  11. 13 0
      spring-boot-fastDFS/src/main/resources/templates/upload.html
  12. 16 0
      spring-boot-fastDFS/src/main/resources/templates/uploadStatus.html
  13. 48 0
      spring-boot-file-upload/pom.xml
  14. 30 0
      spring-boot-file-upload/src/main/java/com/neo/FileUploadWebApplication.java
  15. 18 0
      spring-boot-file-upload/src/main/java/com/neo/controller/GlobalExceptionHandler.java
  16. 54 0
      spring-boot-file-upload/src/main/java/com/neo/controller/UploadController.java
  17. 11 0
      spring-boot-file-upload/src/main/resources/application.properties
  18. 24 0
      spring-boot-file-upload/src/main/resources/logback.xml
  19. 13 0
      spring-boot-file-upload/src/main/resources/templates/upload.html
  20. 12 0
      spring-boot-file-upload/src/main/resources/templates/uploadStatus.html

+ 52 - 0
spring-boot-fastDFS/pom.xml

@@ -0,0 +1,52 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+  http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.neo</groupId>
+    <artifactId>spring-boot-fastDFS</artifactId>
+    <packaging>jar</packaging>
+    <version>1.0</version>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>1.5.9.RELEASE</version>
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.csource</groupId>
+            <artifactId>fastdfs-client-java</artifactId>
+            <version>1.27-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 30 - 0
spring-boot-fastDFS/src/main/java/com/neo/FastDFSApplication.java

@@ -0,0 +1,30 @@
+package com.neo;
+
+import org.apache.coyote.http11.AbstractHttp11Protocol;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class FastDFSApplication {
+
+    public static void main(String[] args) throws Exception {
+        SpringApplication.run(FastDFSApplication.class, args);
+    }
+
+    //Tomcat large file upload connection reset
+    @Bean
+    public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
+        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
+        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
+            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
+                //-1 means unlimited
+                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
+            }
+        });
+        return tomcat;
+    }
+
+}

+ 19 - 0
spring-boot-fastDFS/src/main/java/com/neo/config/Configurations.java

@@ -0,0 +1,19 @@
+package com.neo.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Configurations {
+    
+    @Value("${fastdfs.base.url}")
+    private String fdfsUrl;
+
+    public String getFdfsUrl() {
+        return fdfsUrl;
+    }
+
+    public void setFdfsUrl(String fdfsUrl) {
+        this.fdfsUrl = fdfsUrl;
+    }
+}

+ 20 - 0
spring-boot-fastDFS/src/main/java/com/neo/controller/GlobalExceptionHandler.java

@@ -0,0 +1,20 @@
+package com.neo.controller;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.multipart.MultipartException;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    //https://jira.spring.io/browse/SPR-14651
+    //4.3.5 supports RedirectAttributes redirectAttributes
+    @ExceptionHandler(MultipartException.class)
+    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {
+
+        redirectAttributes.addFlashAttribute("message", e.getCause().getMessage());
+        return "redirect:/uploadStatus";
+
+    }
+}

+ 85 - 0
spring-boot-fastDFS/src/main/java/com/neo/controller/UploadController.java

@@ -0,0 +1,85 @@
+package com.neo.controller;
+
+import com.neo.config.Configurations;
+import com.neo.fastdfs.FastDFSClient;
+import com.neo.fastdfs.FastDFSFile;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+@Controller
+public class UploadController {
+    private static Logger logger = LoggerFactory.getLogger(UploadController.class);
+    @Autowired
+    private Configurations configuration;
+
+    @GetMapping("/")
+    public String index() {
+        return "upload";
+    }
+
+    @PostMapping("/upload") //new annotation since 4.3
+    public String singleFileUpload(@RequestParam("file") MultipartFile file,
+                                   RedirectAttributes redirectAttributes) {
+        if (file.isEmpty()) {
+            redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
+            return "redirect:uploadStatus";
+        }
+
+        try {
+            // Get the file and save it somewhere
+            String path=saveFile(file);
+            redirectAttributes.addFlashAttribute("message",
+                    "You successfully uploaded '" + file.getOriginalFilename() + "'");
+            redirectAttributes.addFlashAttribute("path",
+                    "file path url '" + path + "'");
+        } catch (Exception e) {
+            logger.error("upload file failed",e);
+        }
+        return "redirect:/uploadStatus";
+    }
+
+    @GetMapping("/uploadStatus")
+    public String uploadStatus() {
+        return "uploadStatus";
+    }
+
+    /**
+     * @param multipartFile
+     * @return
+     * @throws IOException
+     */
+    public String saveFile(MultipartFile multipartFile) throws IOException {
+        String[] fileAbsolutePath={};
+        String fileName=multipartFile.getOriginalFilename();
+        String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
+        byte[] file_buff = null;
+        InputStream inputStream=multipartFile.getInputStream();
+        if(inputStream!=null){
+            int len1 = inputStream.available();
+            file_buff = new byte[len1];
+            inputStream.read(file_buff);
+        }
+        inputStream.close();
+        FastDFSFile file = new FastDFSFile(fileName, file_buff, ext);
+        try {
+            fileAbsolutePath = FastDFSClient.upload(file);  //upload to fastdfs
+        } catch (Exception e1) {
+            e1.printStackTrace();
+        }
+        if (fileAbsolutePath==null) {
+            System.out.println("upload file failed,please upload again!");
+        }
+        String path=configuration.getFdfsUrl()+fileAbsolutePath[0]+ "/"+fileAbsolutePath[1];
+        return path;
+    }
+}

+ 103 - 0
spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSClient.java

@@ -0,0 +1,103 @@
+package com.neo.fastdfs;
+
+import org.csource.common.NameValuePair;
+import org.csource.fastdfs.*;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+
+import java.io.*;
+
+public class FastDFSClient {
+	private static org.slf4j.Logger logger = LoggerFactory.getLogger(FastDFSClient.class);
+	private static TrackerClient trackerClient;
+	private static TrackerServer trackerServer;
+	private static StorageClient storageClient;
+	private static StorageServer storageServer;
+
+	static {
+		try {
+			Resource resource = new ClassPathResource("fdfs_client.conf");
+			File file = resource.getFile();
+			String configFile = file.getAbsolutePath();
+
+			ClientGlobal.init(configFile);
+			trackerClient = new TrackerClient();
+			trackerServer = trackerClient.getConnection();
+			storageServer = trackerClient.getStoreStorage(trackerServer);
+		} catch (Exception e) {
+			logger.error("FastDFS Client Init Fail!",e);
+		}
+	}
+
+	public static String[] upload(FastDFSFile file) {
+		logger.info("File Name: " + file.getName() + "File Length:" + file.getContent().length);
+
+		NameValuePair[] meta_list = new NameValuePair[1];
+		meta_list[0] = new NameValuePair("author", file.getAuthor());
+
+		long startTime = System.currentTimeMillis();
+		String[] uploadResults = null;
+		try {
+			storageClient = new StorageClient(trackerServer, storageServer);
+			uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
+		} catch (IOException e) {
+			logger.error("IO Exception when uploadind the file:" + file.getName(), e);
+		} catch (Exception e) {
+			logger.error("Non IO Exception when uploadind the file:" + file.getName(), e);
+		}
+		logger.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms");
+
+		if (uploadResults == null) {
+			logger.error("upload file fail, error code:" + storageClient.getErrorCode());
+		}
+		String groupName = uploadResults[0];
+		String remoteFileName = uploadResults[1];
+
+		logger.info("upload file successfully!!!" + "group_name:" + groupName + ", remoteFileName:" + " " + remoteFileName);
+		return uploadResults;
+	}
+
+	public static FileInfo getFile(String groupName, String remoteFileName) {
+		try {
+			storageClient = new StorageClient(trackerServer, storageServer);
+			return storageClient.get_file_info(groupName, remoteFileName);
+		} catch (IOException e) {
+			logger.error("IO Exception: Get File from Fast DFS failed", e);
+		} catch (Exception e) {
+			logger.error("Non IO Exception: Get File from Fast DFS failed", e);
+		}
+		return null;
+	}
+
+	public static InputStream downFile(String groupName, String remoteFileName) {
+		try {
+			storageClient = new StorageClient(trackerServer, storageServer);
+			byte[] fileByte = storageClient.download_file(groupName, remoteFileName);
+			InputStream ins = new ByteArrayInputStream(fileByte);
+			return ins;
+		} catch (IOException e) {
+			logger.error("IO Exception: Get File from Fast DFS failed", e);
+		} catch (Exception e) {
+			logger.error("Non IO Exception: Get File from Fast DFS failed", e);
+		}
+		return null;
+	}
+
+	public static void deleteFile(String groupName, String remoteFileName)
+			throws Exception {
+		storageClient = new StorageClient(trackerServer, storageServer);
+		int i = storageClient.delete_file(groupName, remoteFileName);
+		logger.info("delete file successfully!!!" + i);
+	}
+
+	public static StorageServer[] getStoreStorages(String groupName)
+			throws IOException {
+		return trackerClient.getStoreStorages(trackerServer, groupName);
+	}
+
+	public static ServerInfo[] getFetchStorages(String groupName,
+												String remoteFileName) throws IOException {
+		return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
+	}
+}

+ 70 - 0
spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSFile.java

@@ -0,0 +1,70 @@
+package com.neo.fastdfs;
+
+public class FastDFSFile {
+	private String name;
+
+	private byte[] content;
+
+	private String ext;
+
+	private String md5;
+
+	private String author;
+
+	public FastDFSFile(String name, byte[] content, String ext, String height,
+					   String width, String author) {
+		super();
+		this.name = name;
+		this.content = content;
+		this.ext = ext;
+		this.author = author;
+	}
+
+	public FastDFSFile(String name, byte[] content, String ext) {
+		super();
+		this.name = name;
+		this.content = content;
+		this.ext = ext;
+
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public byte[] getContent() {
+		return content;
+	}
+
+	public void setContent(byte[] content) {
+		this.content = content;
+	}
+
+	public String getExt() {
+		return ext;
+	}
+
+	public void setExt(String ext) {
+		this.ext = ext;
+	}
+
+	public String getMd5() {
+		return md5;
+	}
+
+	public void setMd5(String md5) {
+		this.md5 = md5;
+	}
+
+	public String getAuthor() {
+		return author;
+	}
+
+	public void setAuthor(String author) {
+		this.author = author;
+	}
+}

+ 6 - 0
spring-boot-fastDFS/src/main/resources/application.properties

@@ -0,0 +1,6 @@
+#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
+#search multipart
+spring.http.multipart.max-file-size=10MB
+spring.http.multipart.max-request-size=10MB
+
+fastdfs.base.url=http://192.168.53.85:8080/

+ 9 - 0
spring-boot-fastDFS/src/main/resources/fdfs_client.conf

@@ -0,0 +1,9 @@
+connect_timeout = 2
+network_timeout = 30
+charset = UTF-8
+http.tracker_http_port = 8080
+http.anti_steal_token = no
+http.secret_key = 123456
+
+tracker_server = 192.168.53.85:22122
+tracker_server = 192.168.53.86:22122

+ 24 - 0
spring-boot-fastDFS/src/main/resources/logback.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>
+                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
+            </Pattern>
+        </layout>
+    </appender>
+
+    <logger name="org.springframework.web" level="error" additivity="false">
+        <appender-ref ref="STDOUT"/>
+    </logger>
+
+    <logger name="com.neo" level="debug" additivity="false">
+        <appender-ref ref="STDOUT"/>
+    </logger>
+
+    <root level="error">
+        <appender-ref ref="STDOUT"/>
+    </root>
+
+</configuration>

+ 13 - 0
spring-boot-fastDFS/src/main/resources/templates/upload.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<body>
+
+<h1>Spring Boot file upload example</h1>
+
+<form method="POST" action="/upload" enctype="multipart/form-data">
+    <input type="file" name="file" /><br/><br/>
+    <input type="submit" value="Submit" />
+</form>
+
+</body>
+</html>

+ 16 - 0
spring-boot-fastDFS/src/main/resources/templates/uploadStatus.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<body>
+
+<h1>Spring Boot - Upload Status</h1>
+
+<div th:if="${message}">
+    <h2 th:text="${message}"/>
+</div>
+
+<div th:if="${path}">
+    <h2 th:text="${path}"/>
+</div>
+
+</body>
+</html>

+ 48 - 0
spring-boot-file-upload/pom.xml

@@ -0,0 +1,48 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+  http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.neo</groupId>
+    <artifactId>spring-boot-file-upload</artifactId>
+    <packaging>jar</packaging>
+    <version>1.0</version>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>1.5.9.RELEASE</version>
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 30 - 0
spring-boot-file-upload/src/main/java/com/neo/FileUploadWebApplication.java

@@ -0,0 +1,30 @@
+package com.neo;
+
+import org.apache.coyote.http11.AbstractHttp11Protocol;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class FileUploadWebApplication {
+
+    public static void main(String[] args) throws Exception {
+        SpringApplication.run(FileUploadWebApplication.class, args);
+    }
+
+    //Tomcat large file upload connection reset
+    @Bean
+    public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
+        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
+        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
+            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
+                //-1 means unlimited
+                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
+            }
+        });
+        return tomcat;
+    }
+
+}

+ 18 - 0
spring-boot-file-upload/src/main/java/com/neo/controller/GlobalExceptionHandler.java

@@ -0,0 +1,18 @@
+package com.neo.controller;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.multipart.MultipartException;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    //https://jira.spring.io/browse/SPR-14651
+    //4.3.5 supports RedirectAttributes redirectAttributes
+    @ExceptionHandler(MultipartException.class)
+    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {
+        redirectAttributes.addFlashAttribute("message", e.getCause().getMessage());
+        return "redirect:/uploadStatus";
+    }
+}

+ 54 - 0
spring-boot-file-upload/src/main/java/com/neo/controller/UploadController.java

@@ -0,0 +1,54 @@
+package com.neo.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+@Controller
+public class UploadController {
+    //Save the uploaded file to this folder
+    private static String UPLOADED_FOLDER = "E://temp//";
+
+    @GetMapping("/")
+    public String index() {
+        return "upload";
+    }
+
+    @PostMapping("/upload") // //new annotation since 4.3
+    public String singleFileUpload(@RequestParam("file") MultipartFile file,
+                                   RedirectAttributes redirectAttributes) {
+        if (file.isEmpty()) {
+            redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
+            return "redirect:uploadStatus";
+        }
+
+        try {
+            // Get the file and save it somewhere
+            byte[] bytes = file.getBytes();
+            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
+            Files.write(path, bytes);
+
+            redirectAttributes.addFlashAttribute("message",
+                    "You successfully uploaded '" + file.getOriginalFilename() + "'");
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return "redirect:/uploadStatus";
+    }
+
+    @GetMapping("/uploadStatus")
+    public String uploadStatus() {
+        return "uploadStatus";
+    }
+
+}

+ 11 - 0
spring-boot-file-upload/src/main/resources/application.properties

@@ -0,0 +1,11 @@
+#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
+#search multipart
+spring.http.multipart.max-file-size=10MB
+spring.http.multipart.max-request-size=10MB
+
+#spring.http.multipart.enabled=true #\u9ED8\u8BA4\u652F\u6301\u6587\u4EF6\u4E0A\u4F20.
+#spring.http.multipart.file-size-threshold=0 #\u652F\u6301\u6587\u4EF6\u5199\u5165\u78C1\u76D8.
+#spring.http.multipart.location= # \u4E0A\u4F20\u6587\u4EF6\u7684\u4E34\u65F6\u76EE\u5F55
+#spring.http.multipart.max-file-size=1Mb # \u6700\u5927\u652F\u6301\u6587\u4EF6\u5927\u5C0F
+#spring.http.multipart.max-request-size=10Mb # \u6700\u5927\u652F\u6301\u8BF7\u6C42\u5927\u5C0F
+

+ 24 - 0
spring-boot-file-upload/src/main/resources/logback.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>
+                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
+            </Pattern>
+        </layout>
+    </appender>
+
+    <logger name="org.springframework.web" level="error" additivity="false">
+        <appender-ref ref="STDOUT"/>
+    </logger>
+
+    <logger name="com.neo" level="debug" additivity="false">
+        <appender-ref ref="STDOUT"/>
+    </logger>
+
+    <root level="error">
+        <appender-ref ref="STDOUT"/>
+    </root>
+
+</configuration>

+ 13 - 0
spring-boot-file-upload/src/main/resources/templates/upload.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<body>
+
+<h1>Spring Boot file upload example</h1>
+
+<form method="POST" action="/upload" enctype="multipart/form-data">
+    <input type="file" name="file" /><br/><br/>
+    <input type="submit" value="Submit" />
+</form>
+
+</body>
+</html>

+ 12 - 0
spring-boot-file-upload/src/main/resources/templates/uploadStatus.html

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<body>
+
+<h1>Spring Boot - Upload Status</h1>
+
+<div th:if="${message}">
+    <h2 th:text="${message}"/>
+</div>
+
+</body>
+</html>