文件上传下载为项目中常见功能,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