commons-fileupload
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
Commons-FileUpload组件的API
ServletFileUpload
void setSizeMax(long sizeMax) 设置请求信息内容的最大允许字节数
List parseRequest(HttpServletRequest request) 解析form表单提交的数据,返回一个FileItem实例的集合
static final boolean isMultipartContent(HttpServletRequest request) 判断请求提交的方式是否是“multipart/form-data”类型
void setHeaderEncoding(String encoding) 设置转换时所使用的字符集编码
FileItem
FileItem接口,用于封装单个表单字段元素的数据,每一个表单字段都对应一个FileItem实例,在应用程序中使用的是其实现类DiskFileItem。FileItem接口提供的常用方法如下:
public boolean isFormField() 判断FileItem对象所封装的数据类型,普通表单字段返回true,文件表单字段返回false
public String getName() 获得文件字段中所上传的文件名,普通表单字段调用此方法返回null
public String getFieldName() 返回表单字段元素的name属性值
public void write(File file) 将FileItem对象中保存的文件数据内容写入到指定的文件中
public String getString() 将FileItem对象中保存的主体内容以一个字符串返回,其有一个重载方法getString(String encoding),可指定所采用的编码集
public long getSize() 返回单个上传文件的字节数
FileItemFactory
FileItemFactory接口与其实现类DiskFileItemFactory,创建ServletFileUpload实例需要依赖FileItemFactory工厂接口,DiskFileItemFactory是此接口的实现类,主要有两个常用方法:
public void setSizeThreshold(int sizeThreshold) 设置内存缓冲区的大小
public void setRepositoryPath(String path) 设置临时文件存放的目录
MultipartFile & File & Byte[]
- MultipartFile是 Spring 框架的一部分,File是 Java 标准库的一部分。
- MultipartFile主要用于接收上传的文件,File主要用于操作系统文件。
- MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含
二进制数据 + 文件名称 + content-type
package org.springframework.web.multipart;
public interface MultipartFile extends InputStreamSource {
String getName();
String getContentType();
long getSize();
InputStream getInputStream() throws IOException;
}
MultipartFile常见的实现类:
Byte[]转MultipartFile
需要借助commons-fileupload依赖包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
代码如下:
public MultipartFile convertByteToMultipartFile(byte[] dataArray, String fileName) throws Exception {
if (Objects.isNull(dataArray)) {
throw new Exception("字节数组为空");
}
// 这里的contentType可以自定义
String contentType = "application/octet-stream";
FileItem item;
try {
FileItemFactory factory = new DiskFileItemFactory();
item = factory.createItem("file", contentType, false, fileName);
try (ByteArrayOutputStream bos = new ByteArrayOutputStream(dataArray.length);
OutputStream os = item.getOutputStream()) {
bos.write(dataArray);
os.write(bos.toByteArray());
}
return new CommonsMultipartFile(item);
} catch (IOException e) {
throw e;
}
}
File转MultipartFile
需要借助commons-fileupload依赖包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
代码如下:
public MultipartFile convertFileToMultipartFile(File file, String fileName) throws Exception {
String contentType = "application/octet-stream";
FileItem item;
try {
FileItemFactory factory = new DiskFileItemFactory();
item = factory.createItem("file", contentType, false, fileName);
try (FileInputStream fileInputStream = new FileInputStream(file);
OutputStream outputStream = item.getOutputStream()) {
IOUtils.copyLarge(fileInputStream, outputStream);
}
return new CommonsMultipartFile(item);
} catch (IOException e) {
throw e;
}
}