如何在不将文件保存到磁盘的情况下将 BufferedImage 转换为多部分文件?
How to convert BufferedImage to a MultiPart file without saving file to disk?
我想在休息服务中进行一个接受以下请求参数的服务调用。此方法将文件上传到图像服务器。
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<String> uploadFile(
@RequestParam("file") MultipartFile file) {
以下是调用服务的代码 - 我从图像 url
中读取 BufferedImage 对象中的图像
BufferedImage subImage= ImageIO.read(new URL(<some image url goes here>));
File outputFile = new File("C:\" + "myimage" + ".jpg");
ImageIO.write(subImage, "jpg", outputFile);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<String, Object>();
String url="http://serviceurl/upload";
body.add("file", outputFile);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<MultiValueMap<String, Object>>(body, headers);
restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
如您所见,首先创建一个文件并将其保存到磁盘。如何避免这一步而只使用 BufferedImage 对象(我不想将文件保存到本地磁盘)。
尝试了下面的解决方案,但在我看来,如果不将文件保存在磁盘上就无法实现。是真的吗?
你可以这样做..我已经创建了 MultipartFile
的实现 class 并且我正在使用新创建的 class 来创建 MultipartFile
文件。
多部分文件实现
public class MultipartImage implements MultipartFile {
private byte[] bytes;
String name;
String originalFilename;
String contentType;
boolean isEmpty;
long size;
public MultipartImage(byte[] bytes, String name, String originalFilename, String contentType,
long size) {
this.bytes = bytes;
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 bytes;
}
@Override
public InputStream getInputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
// TODO Auto-generated method stub
}
}
正在将 Jpg 转换为 MultipartFile
BufferedImage originalImage = ImageIO.read(new File("path to file"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( originalImage, "jpg", baos );
baos.flush();
MultipartFile multipartFile = new MultipartImage(baos.toByteArray());
或
如果您不想自己创建 MultipartFile class 的实现,您可以使用 spring
中的 org.springframework.mock.web.MockMultipartFile
示例:
MultipartFile multipartFile = MockMultipartFile(fileName, baos.toByteArray());
Jobin Joseph,您的 class MultipartImage 是一个很好的起点,但在我的情况下它不起作用。我需要 class 以编程方式将图像从数据库重新发送到 Post 服务,但它无法正常工作,因为该服务需要其他字段和字段名称(以及一个可序列化的对象)。我将您的 class 修改为用作常规 MultipartFile 实现:
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import org.springframework.web.multipart.MultipartFile;
public class MultipartImage implements MultipartFile, Serializable {
private static final long serialVersionUID = 7417500052547882043L;
private byte[] bytes;
String fileName;
String contentType;
String fieldName;
boolean isEmpty;
long size;
public MultipartImage(byte[] bytes, String fileName, String fieldName, String contentType, long size) {
this.bytes = bytes;
this.fileName = fileName;
this.fieldName = fieldName;
this.contentType = contentType;
this.size = size;
this.isEmpty = false;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public void setEmpty(boolean isEmpty) {
this.isEmpty = isEmpty;
}
public void setSize(long size) {
this.size = size;
}
@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 bytes;
}
@Override
public InputStream getInputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
// TODO Auto-generated method stub
}
@Override
public String getName() {
// TODO Auto-generated method stub
return fileName;
}
@Override
public String getOriginalFilename() {
// TODO Auto-generated method stub
return fileName;
}
}
我希望这可以帮助其他人。
我想在休息服务中进行一个接受以下请求参数的服务调用。此方法将文件上传到图像服务器。
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<String> uploadFile(
@RequestParam("file") MultipartFile file) {
以下是调用服务的代码 - 我从图像 url
中读取 BufferedImage 对象中的图像 BufferedImage subImage= ImageIO.read(new URL(<some image url goes here>));
File outputFile = new File("C:\" + "myimage" + ".jpg");
ImageIO.write(subImage, "jpg", outputFile);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<String, Object>();
String url="http://serviceurl/upload";
body.add("file", outputFile);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<MultiValueMap<String, Object>>(body, headers);
restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
如您所见,首先创建一个文件并将其保存到磁盘。如何避免这一步而只使用 BufferedImage 对象(我不想将文件保存到本地磁盘)。
尝试了下面的解决方案,但在我看来,如果不将文件保存在磁盘上就无法实现。是真的吗?
你可以这样做..我已经创建了 MultipartFile
的实现 class 并且我正在使用新创建的 class 来创建 MultipartFile
文件。
多部分文件实现
public class MultipartImage implements MultipartFile {
private byte[] bytes;
String name;
String originalFilename;
String contentType;
boolean isEmpty;
long size;
public MultipartImage(byte[] bytes, String name, String originalFilename, String contentType,
long size) {
this.bytes = bytes;
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 bytes;
}
@Override
public InputStream getInputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
// TODO Auto-generated method stub
}
}
正在将 Jpg 转换为 MultipartFile
BufferedImage originalImage = ImageIO.read(new File("path to file"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( originalImage, "jpg", baos );
baos.flush();
MultipartFile multipartFile = new MultipartImage(baos.toByteArray());
或
如果您不想自己创建 MultipartFile class 的实现,您可以使用 spring
中的org.springframework.mock.web.MockMultipartFile
示例:
MultipartFile multipartFile = MockMultipartFile(fileName, baos.toByteArray());
Jobin Joseph,您的 class MultipartImage 是一个很好的起点,但在我的情况下它不起作用。我需要 class 以编程方式将图像从数据库重新发送到 Post 服务,但它无法正常工作,因为该服务需要其他字段和字段名称(以及一个可序列化的对象)。我将您的 class 修改为用作常规 MultipartFile 实现:
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import org.springframework.web.multipart.MultipartFile;
public class MultipartImage implements MultipartFile, Serializable {
private static final long serialVersionUID = 7417500052547882043L;
private byte[] bytes;
String fileName;
String contentType;
String fieldName;
boolean isEmpty;
long size;
public MultipartImage(byte[] bytes, String fileName, String fieldName, String contentType, long size) {
this.bytes = bytes;
this.fileName = fileName;
this.fieldName = fieldName;
this.contentType = contentType;
this.size = size;
this.isEmpty = false;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public void setEmpty(boolean isEmpty) {
this.isEmpty = isEmpty;
}
public void setSize(long size) {
this.size = size;
}
@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 bytes;
}
@Override
public InputStream getInputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
// TODO Auto-generated method stub
}
@Override
public String getName() {
// TODO Auto-generated method stub
return fileName;
}
@Override
public String getOriginalFilename() {
// TODO Auto-generated method stub
return fileName;
}
}
我希望这可以帮助其他人。