2014-06-10 8 views
1

자바 서블릿의 이미지 파일에 캔버스 이미지를 HTML 페이지에서 저장하려고했습니다. Ajax 요청을 통해 HTML에서 Java Servlet으로 이미지를 보내야합니다. 누군가 나를 도울 수 있습니까? 난 이미 때문에이 작동하지 않습니다, request.getPart("myImg")가 null 반환, 다음과 같은 옵션 여기 자바 서블릿에서 캔버스 이미지를 png 이미지 파일로 저장

Stack Overflow Question 1

을 시도했습니다. 제발 도와주세요.

은 또한 다음과 같은 솔루션 Sending content of canvas to java

을 시도 여기에서의 문제는

BufferedImage bfi = ImageIO.read(new ByteArrayInputStream(decodedBytes)); 

도와주세요 다음 줄에를 설정 나에게 유효하지 않은 문자/길이의 예외를주고 있다는 것입니다! !

UPDATE :

여기

내 아약스 코드 :

function uploadImage() { 
    var canvasServer = document.getElementById("canvasThumbResult"); 
    var context = canvasServer.getContext("2d");      
    var imageDataURL = canvasServer.toDataURL('image/png'); 

    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", trinityCvaServicesUrl+"common/uploadImage", true); 
    var boundary = Math.random().toString().substr(2); 
    xhr.setRequestHeader("content-type", 
     "multipart/form-data; charset=utf-8; boundary=" + boundary); 
    var multipart = "--" + boundary + "\r\n" + 
     "Content-Disposition: form-data; name=myImg\r\n" + 
     "Content-type: image/png\r\n\r\n" + 
     imageDataURL + "\r\n" + 
     "--" + boundary + "--\r\n"; 
    xhr.send(multipart);  
    /*xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
    xhr.send("imgData="+imageDataURL);*/ 
} 

그리고 여기 내 자바 코드 : 어떻게 든 이미지를 저장 관리해야

FileOutputStream fos = null; 
     try { 
      Part part = req.getPart("myImg"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(
        part.getInputStream(), Charset.forName("utf-8"))); 

      /*String imgData = request.getParameter("imgData"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(
        new ByteArrayInputStream(
          imgData.getBytes(StandardCharsets.UTF_8)), 
        Charset.forName("utf-8")));*/ 

      String sImg = br.readLine(); 
      sImg = sImg.substring("data:image/png;base64,".length()); 
      byte[] bImg64 = sImg.getBytes(); 
      byte[] bImg = Base64.decodeBase64(bImg64); 
      fos = new FileOutputStream(ReloadableProps.getProperty("local.image.save.path")+"img.png"); 
      fos.write(bImg); 

      /*String imgData = req.getParameter("imgData"); 
      String img64 = imgData.replaceAll("data:image/png;base64,", ""); 
      byte[] decodedBytes = DatatypeConverter.parseBase64Binary(img64); 
      BufferedImage bfi = ImageIO.read(new ByteArrayInputStream(decodedBytes));  
      File outputfile = new File(ReloadableProps.getProperty("local.image.save.path")+"img.png"); 
      ImageIO.write(bfi , "png", outputfile); 
      bfi.flush();*/ 
     } catch (Exception e) { 
      e.printStackTrace(); 
      String loggerMessage = "Upload image failed : "; 
      CVAException.printException(loggerMessage + e.getMessage()); 
     } finally { 
      if(fos != null) { 
       fos.close(); 
      } 
     } 
+0

대신, 함께 자신의 코드를 패치하는 방법을 우리가 추측 할 수 희망 다른 질문에 연결하는 왜 당신의 Ajax 코드를 게시? – developerwjk

+0

답변 해 주셔서 감사합니다. 내 질문에 아약스와 자바 코드를 게시했다. 제발 도와주세요. – ArinCool

+0

또한 스택 추적을 게시하고 소스에서 스택 추적의 맨 위에있는 행을 표시해야합니다. 또는 위의 방법으로 작동하지 않는 방법을 지정하십시오. – haraldK

답변

2

. 그것이 효율적인 방법인지 확실하지 않습니다. 이것이 효과적인 방법이 아닐 수도 있다고 생각한다면 의견을 말하십시오. 의견을 보내 주시면 감사하겠습니다.

내 자바 스크립트 코드 :

var canvasServer = document.getElementById("canvasThumbResult"); 
    var context = canvasServer.getContext("2d");      
    var imageDataURL = canvasServer.toDataURL('image/png'); 
    var ajax = new XMLHttpRequest(); 
    ajax.open("POST",trinityCvaServicesUrl+"common/uploadImage",false); 
    ajax.setRequestHeader("Content-Type", "application/upload"); 
    ajax.send(imageDataURL); 

내 자바 코드 :

 InputStream in = null; 
     FileOutputStream fos = null; 
     try { 
      HttpServletRequestWrapper wrappedRequest = new HttpServletRequestWrapper(req); 
      InputStream is = wrappedRequest.getInputStream(); 
      StringWriter writer = new StringWriter(); 
      IOUtils.copy(is, writer, "UTF-8"); 
      String imageString = writer.toString(); 
      imageString = imageString.substring("data:image/png;base64," 
        .length()); 
      byte[] contentData = imageString.getBytes(); 
      byte[] decodedData = Base64.decodeBase64(contentData); 
      String imgName = ReloadableProps 
        .getProperty("local.image.save.path") 
        + String.valueOf(System.currentTimeMillis()) + ".png"; 
      fos = new FileOutputStream(imgName); 
      fos.write(decodedData); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      String loggerMessage = "Upload image failed : "; 
      CVAException.printException(loggerMessage + e.getMessage()); 
     } finally { 
      if (in != null) { 
       in.close(); 
      } 
      if (fos != null) { 
       fos.close(); 
      } 
     } 
+0

나는 js에 갇혀 있었고, 변화하는 콘텐츠 유형이 나를 위해 일했습니다. –

관련 문제