文件上傳下載爲項目中常見功能,JDK1.7後經過實現AutoCloseable簡化IO流關閉操做,本文順帶介紹spring mvc中批量文件上傳(一個或多個)和下載文件的兩種方式。html
一、JDK1.7java
二、Spring Boot 1.5.9.RELEASEgit
三、IDEA github
JDK1.7以前web
// JDK1.7之前的版本,釋放資源的寫法 static String readFirstLingFromFile(String path) throws IOException { BufferedReader br = null; try { br = new BufferedReader(new FileReader(path)); return br.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) br.close(); } return null; }
JDK1.7以後 經過try(){}catch(){]語法以下。spring
package com; public class Test { public static void main(String[] args) { System.out.println("無異常測試開始!"); try(Io io = new Io()){ io.work(); }catch (Exception e){ e.printStackTrace(); } System.out.println("有異常測試開始!"); try(Io io = new Io()){ io.workThrowExcption(); }catch (Exception e){ e.printStackTrace(); } } } class Io implements AutoCloseable{ void work(){ System.out.println("工做中!"); } void workThrowExcption(){ System.out.println("工做中!產生異常!"); throw new RuntimeException(); } @Override public void close() throws Exception { System.out.println("自動調用關閉方法!"); } }
測試結果以下:apache
實現了AutoCloseable會在有異常或try語句塊結束後自動調用close()方法。mvc
一、文件上傳,經過spring MVC的方式。MultipartFile爲單文件上傳的參數,spring 已經爲咱們封裝好了多文件上傳的接口,這裏咱們使用多文件上傳的方式(支持一個或多個文件)。app
/** * 單一或多個文件上傳,上傳後的文件存儲根據須要本身擴展,一批中有失敗的文件暫不刪除。 * * @param request * @return */ @RequestMapping(value = "fileUpload", method = RequestMethod.POST) public String handleFileUpload(MultipartHttpServletRequest request) { List<MultipartFile> files = request.getFiles("file"); for (MultipartFile file : files) { if (!file.isEmpty()) { try { //文件存放路徑 File dest = new File(FILE_PATH + file.getOriginalFilename()); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } file.transferTo(dest); } catch (Exception e) { //以前和以後的文件都不處理 return file.getOriginalFilename() + "上傳失敗!"; } } else { //以前和以後的文件都不處理 return file.getOriginalFilename() + "是空文件!"; } } return "批量上傳成功!"; }
二、文件下載maven
1) spring 方式,spring這種方式不支持大文件下載,會出現oom異常。
@RequestMapping(value = "{fileName}/download2") public ResponseEntity<byte[]> download(@PathVariable(value = "fileName") String fileName) throws Exception { File file = new File(FILE_PATH + fileName); HttpHeaders headers = new HttpHeaders(); //以附件的形式下載 headers.setContentDispositionFormData("attachment", fileName); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); }
2)傳統方式 經過JDK1.7自動關閉功能,簡化了IO操做的樣板代碼。
/** * 文件下載 * * @param response * @return */ @RequestMapping("{fileName}/download1") public String downloadFile(@PathVariable(value = "fileName") String fileName, HttpServletResponse response) { if (fileName != null) { File file = new File(FILE_PATH + fileName); if (file.exists()) { response.setContentType("application/force-download");// 設置強制下載不打開 //以附件的形式下載 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 設置文件名 byte[] buffer = new byte[1024 * 100]; try (FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis)) { OutputStream os = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } os.flush(); return "下載成功"; } catch (Exception e) { e.printStackTrace(); } } } else { return "文件不存在!"; } return "下載失敗"; }
三、簡單的html測試。
<html>
<head></head>
<body>
<div>
<form action="http://localhost:8888/fileUpload" method="post" enctype="multipart/form-data">
<p>文件1<input type="file" name="file" /></p>
<input type="submit" value="提交" />
</form>
</div>
<div>
<form action="http://localhost:8888/fileUpload" method="post" enctype="multipart/form-data">
<p>文件1<input type="file" name="file" /></p>
<p>文件2<input type="file" name="file" /></p>
<input type="submit" value="提交" />
</form>
</div>
</body>
</html>
四、spring boot 控制上傳文件大小
server.port=8888 spring.http.multipart.max-file-size=3MB spring.http.multipart.max-request-size=6MB
五、pom文件
<?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.vi</groupId> <artifactId>file-uploan-down</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.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</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-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project>
寫的是一個簡版的,根據不一樣的業務場景擴展吧。
https://github.com/binary-vi/binary.github.io/tree/master/SpringBoot-file-upload-down