2017-05-12 1 views
0

Ich versuche, eine Leinwand PNG zu einem Java-Servlet mit Ajax zu senden. Hier ist mein Javascript-Code:Wie Leinwand Leinwandbild an Java-Servlet mit Ajax zu senden?

function sendToServer(image){ 
$.ajax({ 
    type: "POST", 
    url: "SaveAnnotation", 
    data: { 
     annotationImage: image 
     }, 
    success: function(msg) 
    {      
      alert(msg); 
    }, 
    error: function() 
    { 
     alert("Error connecting to server!"); 
    } 
}); 
} 

function save() { 
var dataURL = canvas.toDataURL(); 
sendToServer(dataURL); 
} 

und das Java-Servlet doPost():

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/plain");  
    try{ 
     String img64 = request.getParameter("annotationImage"); 
     byte[] decodedBytes = DatatypeConverter.parseBase64Binary(img64); 
     BufferedImage bfi = ImageIO.read(new ByteArrayInputStream(decodedBytes));  
     File outputfile = new File("saved_annotations/saved.png"); 
     ImageIO.write(bfi , "png", outputfile); 
     bfi.flush(); 
     out.print("Success!"); 
    }catch(IOException e){ 
      out.print(e.getMessage()); 
    } 
} 

Das Problem ist, dass getParameter("annotationImage") kehrt null, und ich kann nicht verstehen, warum: Debugger-Browser kann ich siehe annotationImage und sein Wert zwischen den Anfrageparametern, also bin ich sicher, dass es nicht Null ist, aber aus irgendeinem Grund wird der Parameter nicht vom Java Servlet empfangen.

+0

http://stackoverflow.com/questions/3831680/httpservletrequest-get-json-post-data –

Antwort

0

Ich fand die Gründe, warum es nicht funktioniert hat. Um zu vermeiden, JSON zu analysieren, sende ich die Daten an den Server, ohne einen Parameter zu setzen, Schreiben data: image anstelle von JSON formatiert data: {annotationImage: image} um JSON Parsing im Servlet zu vermeiden.

Im Java-Servlet bekomme ich den gesamten Anfragetext, entferne die Content-Type-Deklaration und decodiere und speichere das Bild. Hier ist der Code:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    PrintWriter out = response.getWriter(); 
    response.setContentType("text/plain"); 

    StringBuffer jb = new StringBuffer(); 
    String line = null; 
    BufferedReader reader = request.getReader(); 
    while ((line = reader.readLine()) != null) 
     jb.append(line); 

    String img64 = jb.toString(); 
    //check if the image is really a base64 png, maybe a bit hard-coded 
    if(img64 != null && img64.startsWith("data:image/png;base64,")){ 
     //Remove Content-type declaration 
     img64 = img64.substring(img64.indexOf(',') + 1);    
    }else{ 
     response.setStatus(403); 
     out.print("Formato immagine non corretto!"); 
     return; 
    } 
    try{ 
     InputStream stream = new ByteArrayInputStream(Base64.getDecoder().decode(img64.getBytes())); 
     BufferedImage bfi = ImageIO.read(stream); 
     String path = getServletConfig().getServletContext().getRealPath("saved_annotations/saved.png"); 
     File outputfile = new File(path); 
     outputfile.createNewFile(); 
     ImageIO.write(bfi , "png", outputfile); 
     bfi.flush(); 
     response.setStatus(200); 
     out.print("L'immagine e' stata salvata con successo!");   
    }catch(IOException e){ 
     e.printStackTrace(); 
     response.setStatus(500); 
     out.print("Errore durante il salvataggio dell'immagine: " + e.getMessage());  
    } 
} 
Verwandte Themen