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