2014-06-14 18 views
5

ich schreibe einen webservice mit feder.
Dieser Dienst nimmt die base64 Bild als String-Parameter codiert
ich diesen String in Bild entschlüsseln möchten und laden in Server ..wie hochzuladen codierte base64 bild auf den server mit spring

@RequestMapping(value="/uploadImage",method = RequestMethod.POST) 
public @ResponseBody String uploadImage(@RequestParam("encodedImage") String encodedImage) 
{ 
    byte[] imageByte= Base64.decodeBase64(encodedImage); 
    return null; 
} 

Bitte helfen ..

Antwort

1

Die folgende Code wird verwendet, um die Zeichenfolge zu dekodieren, die unter Verwendung von Basis 64 und wird verwendet zum Hochladen Bild in den Server verschlüsselt ist.

Dies funktioniert gut für mich ..

@RequestMapping(value="/uploadImage2",method = RequestMethod.POST) 
    public @ResponseBody String uploadImage2(@RequestParam("imageValue") String imageValue,HttpServletRequest request) 
    { 
     try 
     { 
      //This will decode the String which is encoded by using Base64 class 
      byte[] imageByte=Base64.decodeBase64(imageValue); 

      String directory=servletContext.getRealPath("/")+"images/sample.jpg"; 

      new FileOutputStream(directory).write(imageByte); 
      return "success "; 
     } 
     catch(Exception e) 
     { 
      return "error = "+e; 
     } 

    } 
+3

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. –

1

Verwendung von Java Base64.Decoder die dekodieren String zu einem Byte-Array.

Wenn das in Ihrer Java-Version nicht verfügbar ist, können Sie die gleiche Funktionalität aus dem Projekt Apache Commons Codec verwenden.

+0

jetzt ich es mithilfe des folgenden Codes dekodieren kann. Byte [] imageByte = Base64.decodeBase64 (response.getImageString()); Aber ich muss es (oder Bild) Format – srihari

+0

So Datei ändern, wird Ihr Problem gelöst? –

+0

nicht. Ich habe die Zeichenfolge nur in Byte [] dekodiert, aber ich möchte die Datei ändern. – srihari

0

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.

+0

Hinweis: Sie könnten auch vermeiden, Apache Commons hier zu verwenden, wenn Sie es nicht brauchen und einfach mit der neuen Klasse java8 java.util.base64 gehen. 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. –

0

Es folgt für mich arbeiten:

package com.SmartBitPixel.XYZ.pqr.Controllers; 

import java.util.Base64;  
import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.util.Base64;  
import java.util.List;  
import java.util.Locale;  
import javax.servlet.http.HttpServletRequest;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.beans.factory.annotation.Qualifier;  
import org.springframework.stereotype.Controller;  
import org.springframework.ui.Model;  
import org.springframework.web.bind.annotation.ModelAttribute;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.multipart.MultipartFile;  

@Controller  
public class MainDocController  
{  
    @RequestMapping(value="/ProfileRegSubmit", method=RequestMethod.POST) 
    public String handleFileUpload( 
      @RequestParam("fName") String fName, @RequestParam("lName") String lName, 
      @RequestParam("imgName") String imgName, @RequestParam("webcamScanImage") String scanImageFile) 
    {  

     if (!scanImageFile.isEmpty()) 
     { 
      try 
      {    
       byte[] scanBytes = Base64.getDecoder().decode(scanImageFile); 


           /////////////////////////////////////////////////////////////// 
       // Creating the directory to store file/data/image //////////// 

       String rootPath = System.getProperty("catalina.home"); 

       File fileSaveDir = new File(rootPath + File.separator + SAVE_DIR); 

       // Creates the save directory if it does not exists 
       if (!fileSaveDir.exists()) 
       { 
        fileSaveDir.mkdirs(); 
       } 

       File scanFile = new File(fileSaveDir.getAbsolutePath() + File.separator + "scanImageFile.png"); 
       BufferedOutputStream scanStream = new BufferedOutputStream(new FileOutputStream(scanFile));  
       scanStream.write(scanBytes); 
       scanStream.close(); 

       returnStr = "RegisterSuccessful"; 

      } 
      catch (Exception e) 
      { 
       returnStr = "You failed to upload scanImageFile => " + e.getMessage(); 
      } 
     } 
     else 
     { 
      returnStr = "You failed to upload scanImageFile because the file is empty."; 
     } 
    } 
} 
Verwandte Themen