BufferedImage转换为MultipartFile
Java里读取图片或调整图片大小可使用BufferedImage进行操作(参考我另一篇文章Java修改图片大小尺寸),但有时候我们需要将BufferedImage转为MultipartFile进行其他操作可如下转换:
方法一
1.新建ConvertToMultipartFile类实现MultipartFile接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
public class ConvertToMultipartFile implements MultipartFile {
private byte [] fileBytes;
String name;
String originalFilename;
String contentType;
boolean isEmpty;
long size;
public ConvertToMultipartFile( byte [] fileBytes, String name, String originalFilename, String contentType,
long size) {
this .fileBytes = fileBytes;
this .name = name;
this .originalFilename = originalFilename;
this .contentType = contentType;
this .size = size;
this .isEmpty = false ;
}
@Override
public String getName() {
return name;
}
@Override
public String getOriginalFilename() {
return originalFilename;
}
@Override
public String getContentType() {
return contentType;
}
@Override
public boolean isEmpty() {
return isEmpty;
}
@Override
public long getSize() {
return size;
}
@Override
public byte [] getBytes() throws IOException {
return fileBytes;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(fileBytes);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
new FileOutputStream(dest).write(fileBytes);
}
}
|
2.BufferedImage 转换为 MultipartFile
BufferedImage 先转为byte[ ],再通过上面的ConvertToMultipartFile类转为MultipartFile
1
2
3
4
5
6
7
8
9
10
11
12
13
|
try {
//读取图片转换为 BufferedImage
BufferedImage image = ImageIO.read( new FileInputStream( "F:/test/pic1.jpg" ));
//BufferedImage 转化为 ByteArrayOutputStream
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "jpg" , out);
//ByteArrayOutputStream 转化为 byte[]
byte [] imageByte = out.toByteArray();
//将 byte[] 转为 MultipartFile
MultipartFile multipartFile = new ConvertToMultipartFile(imageByte, "newNamepic" , "pic1" , "jpg" , imageByte.length);
} catch (IOException e) {
e.printStackTrace();
}
|
方法二
引入依赖:
1
2
3
4
5
6
|
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-test</ artifactId >
< version >5.3.2</ version >
< scope >compile</ scope >
</ dependency >
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
try {
//读取图片转换为 BufferedImage
BufferedImage image = ImageIO.read( new FileInputStream( "F:/test/pic1.jpg" ));
//调整图片大小后的BufferedImage。resizeImage方法是调整图片大小的可参考文章开头我上一篇文章
BufferedImage newImage = ImageUtils.resizeImage(image, 200 , 200 );
//将newImage写入字节数组输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( newImage, "jpg" , baos );
//转换为MultipartFile
MultipartFile multipartFile = new MockMultipartFile( "pic1.jpg" , baos.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
|
Java数据转存的中MultipartFile转File
错误背景
由于文件储存在第三方的服务器上,所有需要讲将接收到MultipartFile文件 转换为File 然后传输。(Spring MVC)
通过搜索引擎 找到了以下两种方法
均要在先spring xml中声明。如下:
1
|
< bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" />
|
如需添加最大,最小等范围控制,请自行百度参考。
方法一:强转
方法二:
1
2
3
|
CommonsMultipartFile cf = (CommonsMultipartFile)multfile;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File file = fi.getStoreLocation();
|
亲测有效。但是后期发现设置的问题 导致文件转换中错误,文件不可读从而导致 程序抛出 is not a normal file 异常。
因为错误出现的随机性很大,所以选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
代码如下:
1
2
3
4
5
6
7
8
9
|
File f = null ;
try {
f=File.createTempFile( "tmp" , null );
file.transferTo(f);<br> f.deleteOnExit();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
|
亲测有效。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_33697094/article/details/114357533