Wenn Sie Frühling verwenden Sie in Erwägung ziehen könnte ein HttpMessageConverter mit Ihrem Bild zu einem BufferedImage zu konvertieren, bevor es Ihre Controller erreicht. Ich konnte keine bereits in den Frühlingsumwandlern gefundenen finden (vielleicht habe ich es verpasst?). Jedenfalls habe ich das gerade geschrieben. Sie können es möglicherweise verbessern.
package com.stuff;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
/**
* @author John Deverall
*/
public class Base64EncodedImageHttpMessageConverter extends
AbstractHttpMessageConverter<BufferedImage> {
private Logger logger = Logger.getLogger(this.getClass());
public Base64EncodedImageHttpMessageConverter() {
List<MediaType> mediaTypes = new ArrayList<MediaType>();
String[] supportedMediaTypes = ImageIO.getReaderMIMETypes();
for (String supportedMediaType : supportedMediaTypes) {
String[] typeAndSubtype = supportedMediaType.split("/");
mediaTypes.add(new MediaType(typeAndSubtype[0], typeAndSubtype[1]));
}
setSupportedMediaTypes(mediaTypes);
}
@Override
protected boolean supports(Class<?> clazz) {
return clazz.equals(BufferedImage.class);
}
/** This uses a data uri. If that's not you,
* you'll need to modify this method to decode the base64 data
* straight. */
@Override
protected BufferedImage readInternal(Class<? extends BufferedImage> clazz,
HttpInputMessage inputMessage) throws IOException,
HttpMessageNotReadableException {
StringWriter writer = new StringWriter();
IOUtils.copy(inputMessage.getBody(), writer, "UTF-8");
String imageInBase64 = writer.toString();
int startOfBase64Data = imageInBase64.indexOf(",") + 1;
imageInBase64 = imageInBase64.substring(startOfBase64Data,
imageInBase64.length());
if (Base64.isBase64(imageInBase64) == false) {
logger.error("************************************************");
logger.error("*** IMAGE IN REQUEST IS NOT IN BASE64 FORMAT ***");
logger.error("************************************************");
}
byte[] decodeBase64 = Base64.decodeBase64(imageInBase64);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(
decodeBase64));
return image;
}
@Override
protected void writeInternal(BufferedImage t,
HttpOutputMessage outputMessage) throws IOException,
HttpMessageNotWritableException {
ImageIO.write(t, "jpeg", outputMessage.getBody());
outputMessage.getBody().flush();
}
}
Dann in Ihrem Controller, schreiben Sie so etwas wie diese (oder vorzugsweise die BufferedImage zu irgendeiner Art von Service bekommen). Beachten Sie, dass die Konvertierungslogik von base64 zu BufferedImage wiederverwendbar und im HttpMessageConverter ausgeblendet ist.
@RequestMapping(value = "/image", method = RequestMethod.POST)
public @ResponseBody void saveImage(@PathVariable String memberId, @RequestBody BufferedImage image) {
someService.setBufferedImage(image);
}
@RequestMapping(produces = MediaType.IMAGE_JPEG_VALUE, value = "/image", method = RequestMethod.GET)
public @ResponseBody BufferedImage getImage() {
BufferedImage image = someService.getBufferedImage();
return image;
}
Wenn Sie Spring Java-Konfiguration mit, Konfiguration von HttpMessageConverters sieht wie folgt aus etwas
@Configuration
@EnableWebMvc
public class ApplicationConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
converters.add(getJsonConverter());
converters.add(getImageConverter());
super.configureMessageConverters(converters);
}
@Bean
GsonHttpMessageConverter getJsonConverter() {
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
return converter;
}
@Bean
Base64EncodedImageHttpMessageConverter getImageConverter() {
Base64EncodedImageHttpMessageConverter converter = new Base64EncodedImageHttpMessageConverter();
return converter;
}
}
Wenn Sie möchten, können Sie mit Apache Commons vermeiden, wenn Sie es nicht brauchen und gehen Sie einfach mit der neuen Klasse java8 java.util.base64. Der GsonHttpMessageConverter (zum Umwandeln von JSON in meine Domain-Objekte) wird auch nicht für Bilder verwendet, so dass Sie das aus der Konfiguration herausholen können, wenn Sie nur Bilder haben.
Ich musste den imageValue am ersten Komma teilen und den Rest nehmen, da ich das gesamte Bild einschließlich des "Headers" gesendet habe. Außerdem ist es Base64.getDecoder().decode(), wenn Sie java.util.Base64 verwenden. Hoffe, diese beiden Leckerbissen helfen jemandem. –