Java BufferedImage轉(zhuǎn)換為MultipartFile方式
BufferedImage轉(zhuǎn)換為MultipartFile
Java里讀取圖片或調(diào)整圖片大小可使用BufferedImage進行操作(參考我另一篇文章Java修改圖片大小尺寸),但有時候我們需要將BufferedImage轉(zhuǎn)為MultipartFile進行其他操作可如下轉(zhuǎn)換:
方法一
1.新建ConvertToMultipartFile類實現(xiàn)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 轉(zhuǎn)換為 MultipartFile
BufferedImage 先轉(zhuǎn)為byte[ ],再通過上面的ConvertToMultipartFile類轉(zhuǎn)為MultipartFile
try { //讀取圖片轉(zhuǎn)換為 BufferedImage BufferedImage image = ImageIO.read(new FileInputStream("F:/test/pic1.jpg")); //BufferedImage 轉(zhuǎn)化為 ByteArrayOutputStream ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(image, "jpg", out); //ByteArrayOutputStream 轉(zhuǎn)化為 byte[] byte[] imageByte = out.toByteArray(); //將 byte[] 轉(zhuǎn)為 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 { //讀取圖片轉(zhuǎn)換為 BufferedImage BufferedImage image = ImageIO.read(new FileInputStream("F:/test/pic1.jpg")); //調(diào)整圖片大小后的BufferedImage。resizeImage方法是調(diào)整圖片大小的可參考文章開頭我上一篇文章 BufferedImage newImage = ImageUtils.resizeImage(image, 200, 200); //將newImage寫入字節(jié)數(shù)組輸出流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write( newImage, "jpg", baos ); //轉(zhuǎn)換為MultipartFile MultipartFile multipartFile = new MockMultipartFile("pic1.jpg", baos.toByteArray()); } catch (IOException e) { e.printStackTrace(); }
Java數(shù)據(jù)轉(zhuǎn)存的中MultipartFile轉(zhuǎn)File
錯誤背景
由于文件儲存在第三方的服務器上,所有需要講將接收到MultipartFile文件 轉(zhuǎn)換為File 然后傳輸。(Spring MVC)
通過搜索引擎 找到了以下兩種方法
均要在先spring xml中聲明。如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
如需添加最大,最小等范圍控制,請自行百度參考。
方法一:強轉(zhuǎn)
方法二:
CommonsMultipartFile cf = (CommonsMultipartFile)multfile; DiskFileItem fi = (DiskFileItem) cf.getFileItem(); File file = fi.getStoreLocation();
親測有效。但是后期發(fā)現(xiàn)設置的問題 導致文件轉(zhuǎn)換中錯誤,文件不可讀從而導致 程序拋出 is not a normal file 異常。
因為錯誤出現(xiàn)的隨機性很大,所以選擇用緩沖區(qū)來實現(xiàn)這個轉(zhuǎn)換即使用java 創(chuàng)建的臨時文件 使用 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(); }
親測有效。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java并發(fā)編程volatile關(guān)鍵字的作用
這篇文章主要介紹了Java并發(fā)編程volatile關(guān)鍵字的作用,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-07-07SpringBoot 并發(fā)登錄人數(shù)控制的實現(xiàn)方法
這篇文章主要介紹了SpringBoot 并發(fā)登錄人數(shù)控制的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05springboot CompletableFuture并行計算及使用方法
CompletableFuture基于 Future 和 CompletionStage 接口,利用線程池、回調(diào)函數(shù)、異常處理、組合操作等機制,提供了強大而靈活的異步編程功能,這篇文章主要介紹了springboot CompletableFuture并行計算及使用方法,需要的朋友可以參考下2024-05-05java.lang.UnsupportedClassVersionError錯誤的解決辦法(附圖文)
這篇文章主要給大家介紹了關(guān)于java.lang.UnsupportedClassVersionError錯誤的解決辦法,"java.lang.UnsupportedClassVersionError"意味著您正在運行的Java版本與編譯該類時使用的Java版本不兼容,需要的朋友可以參考下2023-10-10