Java BufferedImage转换为MultipartFile方式
作者:西凉的悲伤
这篇文章主要介绍了Java BufferedImage转换为MultipartFile方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
BufferedImage转换为MultipartFile
Java里读取图片或调整图片大小可使用BufferedImage进行操作(参考我另一篇文章Java修改图片大小尺寸),但有时候我们需要将BufferedImage转为MultipartFile进行其他操作可如下转换:
方法一
1.新建ConvertToMultipartFile类实现MultipartFile接口
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
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(); }
方法二
引入依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.2</version> <scope>compile</scope> </dependency>
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中声明。如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
如需添加最大,最小等范围控制,请自行百度参考。
方法一:强转
方法二:
CommonsMultipartFile cf = (CommonsMultipartFile)multfile; DiskFileItem fi = (DiskFileItem) cf.getFileItem(); File file = fi.getStoreLocation();
亲测有效。但是后期发现设置的问题 导致文件转换中错误,文件不可读从而导致 程序抛出 is not a normal file 异常。
因为错误出现的随机性很大,所以选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
代码如下:
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(); }
亲测有效。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。