2009-12-21 2 views
0

서명 패드와 연결되는 애플릿을 작업하고 있습니다. 서명 패드 API에는 BufferedImage를 반환하는 함수가 있습니다 (API_CALL_TO_RETURN_BUFFERED_IMAGE()라고 가정). jpeg로 인코딩하여이 이미지를 파일에 쓸 수 있습니다 (FileOutputStream 사용). 그러나 로컬 디스크에 쓰는 대신 jpeg로 인코딩 된 이미지를 서버에 업로드해야합니다. 서버에 데이터를 POST 할 수 있으며 이미지를 잘 인코딩 할 수 있습니다. 그러나 나는 두 가지 일을 중간에 만나는 데 어려움을 겪고있다.ByteArrayOutputStream가 서버에 업로드되었습니다.

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
JPEGImageEncode jie = JPEGCodec.createJPEGEncoder(baos); 
jpeg.encode(API_CALL_TO_RETURN_BUFFERED_IMAGE());   // assume magic 

// baos now contains jpeg data 

URLConnection urlc = new URL(some_url).openConnection(); 
// set up urlc request headers and such 
DataOutputStream dos = new DataOutputStream(urlc.getOutputStream()); 
dos.writeBytes(???); // ??? should be image=[the data in baos above] 

// close stuff 

원래, 내가 생각 :

String post_data = URLEncoder.encode("image=" + new String(baos.toByteArray()), some_charset); 
dos.writeBytes(post_data); 

을하지만 명확하게 이미지를 왜곡

다음은 코드의 압축 된 버전입니다 (시도 - 캐치, 기능, 클래스는 생략).

This is what the proper (written locally) image looks like

나는 하나의 하이퍼 링크를 게시 할 수 있지만, 왜곡 된 이미지가 여기에 있습니다 :

가 어떻게이 DataOutputStream 정렬에있는 ByteArrayOutputStream를 작성하려면 어떻게해야합니까 imgur.com/mbmJL.jpg?

EDIT/UPDATE :

내 솔루션은 mutlipart의 POST를 수행하는 것이 었습니다.

다중/폼 데이터는 파일, 비 ASCII 값, 또는 바이너리 데이터에 사용되어야한다 : 다중/폼 데이터로 Content-Type 헤더를 설정하는 이유는이 링크, http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4로 말한다이었다 나는 내가 그 풀 타임 자바 프로그래머에 사소한 확신

dos.writeBytes(baos.toByteArray()); 

있지만 :

는 지금까지 DataOutputStream 정렬에있는 ByteArrayOutputStream를 작성, 그것은처럼 보인다!

필자는 필자가 필요로하는 방식을 제공했기 때문에 제안 된 라이브러리를 사용하지 않았습니다.

답변

3

게시를 관리하려면 HttpClient을 사용하여 위의 일부를 단순화합니다. Post 자습서 및 (필요한 경우) Multipart Post 자습서가 있습니다. 필요한 것은 분명하지 않지만 HttpClient를 사용하면 HTTP 요청의 구조와 내용을 만드는 데 많은 문제를 해결할 수 있습니다.

+0

HttpClient는 매우 편리하고 사용하기 쉽습니다.) – Roman

+0

원래이 문제는 내 자바라고 생각했지만 (지금은 많이 쓰지 않습니다) 문제가 이미지 데이터를 디코딩한다고 생각하고 있습니다. 서버에. –

0

하나의 스트림을 다른 스트림에 쓸 때 많은 오버 헤드가 있습니다. 버퍼, try/catch 블록, .close(), 더 많은 try/catch 블록.

Apache Commons IO Library 대부분이 자동으로 수행됩니다.

서두르지 않으면 어떻게해야할지 생각해보십시오. 그러나 장기적으로는 Commons IO를 사용하십시오. 버퍼링 된 사본의 작동 방식에 대한 예를 보려면 Commons IO 페이지의 첫 번째 예가 전반부를 보여줍니다. System.out.println 대신 다른 행에 행을 써야합니다.

InputStream in = new URL("http://jakarta.apache.org").openStream(); 
try { 
    InputStreamReader inR = new InputStreamReader(in); 
    BufferedReader buf = new BufferedReader(inR); 
    String line; 
    while ((line = buf.readLine()) != null) { 
    System.out.println(line); 
    } 
} finally { 
    in.close(); 
} 

파일이 문자열 데이터가 아닌 경우 String 대신 byte []를 읽는 것이 좋습니다.