MultipartFile实现文件的上传和下载_multipartfile[]
MultipartFile 和 File 的区别
MultipartFile 是 SpringMVC 提供简化上传操作的工具类。在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换为File类,
在 Spring 框架中,对于文件上传下载的支持是通过 MultipartFile 接口来实现的,一个 MultipartFile 就表示客户端传过来的一个文件,而一个 MultipartFile[] 数组,则表示客户端传过来的多个文件,这在实现多文件上传非常有用,当然了,通过该接口,你可以获取客户端传过来的文件的一些基本信息,比如文件名称、文件大小等.当然你也可以让Spring限制客户端传过来文件的大小和类型(比如图片文件png还是文本文件txt),但这些功能的实现配置不在本文的范围内。
所需要的依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
配置,Spring Boot 新版本文件大小一般写作MB,旧版本可能写作Mb
# 启用http上传
spring.servlet.multipart.enabled=true
# 设置支持的单个上传文件的大小限制
spring.servlet.multipart.max-file-size=10MB
# 设置最大的请求文件大小,设置总体大小请求
spring.servlet.multipart.max-request-size=20MB
# 当上传文件达到指定配置量的时候,将文件内容写入磁盘
spring.servlet.multipart.file-size-threshold=512KB
# 设置上传的临时目录
spring.servlet.multipart.location=/
MultipartFile 与 File 相互转换
需求场景
MultipartFile转File
使用FileUtils.copyInputStreamToFile()
public static void main(String[] args) throws Exception {
String path = "F:\\demo\\";
File file = new File(path,"demo.txt");
// 得到MultipartFile文件
MultipartFile multipartFile = getFile();
// 把流输出到文件
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(),file);
// 读取文件第一行
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
System.out.println(bufferedReader.readLine());
// 输出绝对路径
System.out.println(file.getAbsolutePath());
bufferedReader.close();
// 操作完上的文件 需要删除在根目录下生成的文件
if (file.delete()){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
/**
*
* @Description 返回MultipartFile文件
* @return org.springframework.web.multipart.MultipartFile
* @date 2019/1/5 11:08
* @auther dell
*/
public static MultipartFile getFile() throws IOException {
String filePath = "F:\\test.txt";
File file = new File(filePath);
FileItem fileItem = new DiskFileItem("copyfile.txt", Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());
byte[] buffer = new byte[4096];
int n;
try (InputStream inputStream = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()){
while ( (n = inputStream.read(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
//也可以用IOUtils.copy(inputStream,os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.println(multipartFile.getName());
return multipartFile;
}catch (IOException e){
e.printStackTrace();
}
return null;
}