在java开发中,若是处理接收文件,经常会遇到使用MultipartFile,MultipartFile是一个接口,是org.springframework.web.mutipart包下的一个接口,可以用于接收前端传过来的文件,支持的文件包括图片、音频与视频等。MultipartFile翻译成中文来讲就是“多组件的文档”,不用太在乎他的中文含义,一般来讲使用MultipartFile这个类主要是来实现以表单的形式进行文件上传功能。
使用MultipartFile接收文件demo,如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/restful/json/inspection")
@io.swagger.annotations.Api("报备处理接口")
public class MobileInspectionController {
//代码不全,只用于展示部分功能
@PostMapping(value = "/submit")
public Api submit(InspectionDTO inspectionDTO,
@RequestParam(required = false,name = "file") MultipartFile file,
HttpServletRequest request){
//将接收到的MultipartFile 转成 流
byte [] byteArr=file.getBytes();
InputStream inputStream = new ByteArrayInputStream(byteArr);
//将流对象转成MultipartFile,这一步其实使用了MockMultipartFile,因为
//MockMultipartFile是spring-test的包,不能打包到生产中,因此重写了
//MockMultipartFile,应该有其它办法。
fileZip = new
MultipartFileDto(ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
}
重写的MultipartFileDto如下:
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
//重写MockMultipartFile,解决
// <dependency>
// <groupId>org.springframework</groupId>
// <artifactId>spring-test</artifactId>
// <version>RELEASE</version>
//</dependency>不能打包到生产
public class MultipartFileDto implements MultipartFile {
private final String name;
private String originalFilename;
private String contentType;
private final byte[] content ;
/**
* Create a new MultipartFileDto with the given content.
*
* @param name the name of the file
* @param content the content of the file
*/
public MultipartFileDto(String name, byte[] content) {
this(name, "", null, content);
}
/**
* Create a new MultipartFileDto with the given content.
*
* @param name the name of the file
* @param contentStream the content of the file as stream
* @throws IOException if reading from the stream failed
*/
public MultipartFileDto(String name, InputStream contentStream) throws IOException {
this(name, "", null, FileCopyUtils.copyToByteArray(contentStream));
}
/**
* Create a new MultipartFileDto with the given content.
*
* @param name the name of the file
* @param originalFilename the original filename (as on the client's machine)
* @param contentType the content type (if known)
* @param content the content of the file
*/
public MultipartFileDto(String name, String originalFilename, String contentType, byte[] content) {
this.name = name;
this.originalFilename = (originalFilename != null ? originalFilename : "");
this.contentType = contentType;
this.content = (content != null ? content : new byte[0]);
}
/**
* Create a new MultipartFileDto with the given content.
*
* @param name the name of the file
* @param originalFilename the original filename (as on the client's machine)
* @param contentType the content type (if known)
* @param contentStream the content of the file as stream
* @throws IOException if reading from the stream failed
*/
public MultipartFileDto(String name, String originalFilename, String contentType, InputStream contentStream)
throws IOException {
this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));
}
@Override
public String getName() {
return this.name;
}
@Override
public String getOriginalFilename() {
return this.originalFilename;
}
@Override
public String getContentType() {
return this.contentType;
}
@Override
public boolean isEmpty() {
return (this.content.length == 0);
}
@Override
public long getSize() {
return this.content.length;
}
@Override
public byte[] getBytes() throws IOException {
return this.content;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(this.content);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(this.content, dest);
}
}