1

Я хочу сделать служебный вызов, который принимает следующий параметр запроса в службе отдыха. Этот метод загружает файл на сервер изображений.Как преобразовать BufferedImage в файл MultiPart без сохранения файла на диск?

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
    public ResponseEntity<String> uploadFile(
      @RequestParam("file") MultipartFile file) { 

Ниже приводится код, где вызов службы делается - я прочитал изображение объекта BufferedImage из URL изображения

 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); 

AS вы можете видеть, файл первое существо созданный и сохраненный на диске. Как я могу избежать этого шага и просто использовать объект BufferedImage (я не хочу сохранять файл на локальный диск).

Пробовал решение ниже, но мне кажется, что вы не можете достичь этого, не сохраняя файл на своем диске. Это правда?

+1

ли MultipartFile от 'org.springframework.web.multipart.MultipartFile'? – Jobin

ответ

2

вы можете сделать это таким образом. Я создал класс реализации MultipartFile, и я использую этот вновь созданный класс для создания файла MultipartFile.

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 класса ваш собственный, вы можете использовать org.springframework.mock.web.MockMultipartFile от sprin г

Пример:

MultipartFile multipartFile = MockMultipartFile(fileName, baos.toByteArray()); 
+0

Я думаю, что флеш должен произойти после создания объекта multipartFile – Tisha

+0

На самом деле после тщательного тестирования это, похоже, не работает. Я получаю ошибку с 400 ошибкой – Tisha

+0

Я не думаю, что служба, выше которой она вызывается с этим кодом. – Tisha