Spring Boot快速入門之(十六):文件處理
【注】本文譯自: https://www.tutorialspoint.com/spring_boot/spring_boot_file_handling.htm

? ? 本文學習如何使用 web 服務進行文件上傳和下載。
文件上傳
? ?上傳一個文件,可以使用?MultipartFile?作為請求參數(shù),并且這個 API 應當消費?Multi-Part 表單數(shù)據(jù)值。示例代碼如下:
@RequestMapping(value?=?"/upload",?method?=?RequestMethod.POST,?consumes?=?MediaType.MULTIPART_FORM_DATA_VALUE)
public?String?fileUpload(@RequestParam("file")?MultipartFile?file)?{
???return?null;
}
? ?完整代碼如下:
package?com.tutorialspoint.demo.controller;
import?java.io.File;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?org.springframework.http.MediaType;
import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RequestMethod;
import?org.springframework.web.bind.annotation.RequestParam;
import?org.springframework.web.bind.annotation.RestController;
import?org.springframework.web.multipart.MultipartFile;
@RestController
public?class?FileUploadController?{
???@RequestMapping(value?=?"/upload",?method?=?RequestMethod.POST,?
??????consumes?=?MediaType.MULTIPART_FORM_DATA_VALUE)
???
???public?String?fileUpload(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
??????File?convertFile?=?new?File("/var/tmp/"+file.getOriginalFilename());
??????convertFile.createNewFile();
??????FileOutputStream?fout?=?new?FileOutputStream(convertFile);
??????fout.write(file.getBytes());
??????fout.close();
??????return?"File?is?upload?successfully";
???}
}
文件下載
? ?文件下載應當使用 InputStreamResource。我們要在響應中設置 HttpHeader?Content-Disposition,并且要指定應用的響應媒體類型(Media Type)。
注意:?以下面的例子中,在應用運行時指定路徑上的文件應當是可用的。
@RequestMapping(value?=?"/download",?method?=?RequestMethod.GET)?
public?ResponseEntity<Object>?downloadFile()?throws?IOException??{
???String?filename?=?"/var/tmp/mysql.png";
???File?file?=?new?File(filename);
???InputStreamResource?resource?=?new?InputStreamResource(new?FileInputStream(file));
???HttpHeaders?headers?=?new?HttpHeaders();
??????
???headers.add("Content-Disposition",?String.format("attachment;?filename=\"%s\"",?file.getName()));
???headers.add("Cache-Control",?"no-cache,?no-store,?must-revalidate");
???headers.add("Pragma",?"no-cache");
???headers.add("Expires",?"0");
??????
???ResponseEntity<Object>?
???responseEntity?=?ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(
??????MediaType.parseMediaType("application/txt")).body(resource);
??????
???return?responseEntity;
}
? ?完整代碼如下:
package?com.tutorialspoint.demo.controller;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.IOException;
import?org.springframework.core.io.InputStreamResource;
import?org.springframework.http.HttpHeaders;
import?org.springframework.http.MediaType;
import?org.springframework.http.ResponseEntity;
import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RequestMethod;
import?org.springframework.web.bind.annotation.RestController;
@RestController
public?class?FileDownloadController?{
???@RequestMapping(value?=?"/download",?method?=?RequestMethod.GET)?
???public?ResponseEntity<Object>?downloadFile()?throws?IOException??{
??????String?filename?=?"/var/tmp/mysql.png";
??????File?file?=?new?File(filename);
??????InputStreamResource?resource?=?new?InputStreamResource(new?FileInputStream(file));
??????HttpHeaders?headers?=?new?HttpHeaders();
??????
??????headers.add("Content-Disposition",?String.format("attachment;?filename=\"%s\"",?file.getName()));
??????headers.add("Cache-Control",?"no-cache,?no-store,?must-revalidate");
??????headers.add("Pragma",?"no-cache");
??????headers.add("Expires",?"0");
??????
??????ResponseEntity<Object>?
??????responseEntity?=?ResponseEntity.ok().headers(headers).contentLength(
?????????file.length()).contentType(MediaType.parseMediaType("application/txt")).body(resource);
??????
??????return?responseEntity;
???}
}
? ?主 Spring Boot 應用類如下:
package?com.tutorialspoint.demo;
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public?class?DemoApplication?{
???public?static?void?main(String[]?args)?{
??????SpringApplication.run(DemoApplication.class,?args);
???}
}
? ?Maven build – pom.xml 代碼如下:
<?xml?version?=?"1.0"?encoding?=?"UTF-8"?>
<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/xsd/maven-4.0.0.xsd">?
???
???<modelVersion>4.0.0</modelVersion>
???<groupId>com.tutorialspoint</groupId>
???<artifactId>demo</artifactId>
???<version>0.0.1-SNAPSHOT</version>
???<packaging>jar</packaging>
???<name>demo</name>
???<description>Demo?project?for?Spring?Boot</description>
???<parent>
??????<groupId>org.springframework.boot</groupId>
??????<artifactId>spring-boot-starter-parent</artifactId>
??????<version>1.5.8.RELEASE</version>
??????<relativePath/>?
???</parent>
???<properties>
??????<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
??????<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
??????<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-test</artifactId>
?????????<scope>test</scope>
??????</dependency>
???</dependencies>
???<build>
??????<plugins>
?????????<plugin>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-maven-plugin</artifactId>
?????????</plugin>
??????</plugins>
???</build>
</project>
? ?Gradle Build – build.gradle 代碼如下:
buildscript?{
???ext?{
??????springBootVersion?=?'1.5.8.RELEASE'
???}
???repositories?{
??????mavenCentral()
???}
???dependencies?{
??????classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
???}
}
apply?plugin:?'java'
apply?plugin:?'eclipse'
apply?plugin:?'org.springframework.boot'
group?=?'com.tutorialspoint'
version?=?'0.0.1-SNAPSHOT'
sourceCompatibility?=?1.8
repositories?{
???mavenCentral()
}
dependencies?{
???compile('org.springframework.boot:spring-boot-starter-web')
???testCompile('org.springframework.boot:spring-boot-starter-test')
}
? ?現(xiàn)在你可以使用 Maven 或 Gradle 命令創(chuàng)建可執(zhí)行?executable JAR 文件并運行 Spring Boot 應用了:
? ?Maven 命令如下:
mvn clean install
? ?在 “BUILD SUCCESS” 之后,你可以在 target 目錄下找到 JAR 文件。
? ?Gradle 可以使用以下命令:
gradle clean build
? ?在 “BUILD SUCCESSFUL” 之后,你可以在?build/libs 目錄下找到?JAR 文件。
? ?現(xiàn)在,使用以下命令運行 JAR 文件:
java –jar <JARFILE>
? ?應用將在?Tomcat 8080 端口啟動,如下 所示:

? ?現(xiàn)在在 POSTMAN 應用中輸入以下 URL’s in POSTMAN,可以看到下圖所示的輸出:
? ?文件上傳:?http://localhost:8080/upload
? ?文件下載:?http://localhost:8080/download
