2011-03-19 3 views
0

이상한 문제에 빠져 들었습니다. 나는 두 개의 웹 사이트 beetween는 XML 및 미디어 전송을 위해 org.apache.http.impl.client.HttpClient API를 사용하고, 이제 이미지의 DefaultHttpClient 1.9 킬로바이트를 사용하여 웹에서 (내 경우에는 이미지) 바이너리 내용을 읽는 동안 저장됩니다. 코드가 내 개발 환경 (windows 및 우분투 리눅스)에서 으로 잘 작동하지만 수세 리눅스에서만 사용하기 때문에 문제는 이상합니다.HttpClient API가 1.9kb가 넘는 크기의 이미지를 저장하지 않습니다.

아래 코드는 파일을 저장하는 데 사용 된 코드입니다.

HttpResponse response = defaultHttpClient.execute(request); 
InputStream stream = response.getEntity().getContent(); 
byte[] buffer = new byte[10024]; 
int count = stream.read(buffer); 
buffer = Arrays.copyOf(buffer, count); 
FileOutputStream fstream = new FileOutputStream("myFile.jpeg",true); 
fstream.write(buffer, 0, count); 
fstream.flush(); 
fstream.close(); 
stream.close(); 

도움이 되겠습니다.

감사
Shailesh.

+0

는'HttpGet' 또는'HttpPost' request''한다 (반환 -1 읽기)? –

답변

0

당신은 당신의 바이트 버퍼를 만들기 전에 응답의 콘텐츠 길이를 확인해야한다.

둘째, 당신은 변수 수에 읽은 바이트 수를보고 확인해야한다.

+0

나는 때문에 내가 내 바이트 배열의 크기를 촬영 한이 문제에 난 내 이미지 크기가 여전히 안전 측면과, 5킬로바이트 다음이어야 것이라고 확신 – gopal

+0

... 내 이미지 크기가 5킬로바이트 다음이어야 것 suured하고 10024 .. 그리고 파일에 쓰기 전에 응답에서 읽은 동일한 크기의 배열 복사본을 만듭니다. 그리고 나는 실제로 응답에서 읽은 많은 바이트만을 쓰고 있습니다. 주요 혼란은 동일한 코드가 Windows와 우분투 리눅스에서 잘 작동한다는 것입니다. – gopal

0

귀하의 문제는 귀하의 buffer.length 바이트의 데이터 (단지 10024 바이트)를 읽고 나머지는 읽지 않고 있다는 것입니다.

HttpResponse response = defaultHttpClient.execute(request); 
InputStream stream = response.getEntity().getContent(); 
FileOutputStream fstream = new FileOutputStream("myFile.jpeg",true); 
byte[] buffer = new byte[10024]; 
int count = -1; 
while ((count = stream.read(buffer)) != -1) { 
    fstream.write(buffer); 
} 
fstream.flush(); 
fstream.close(); 
stream.close(); 

플러스, 나는 finally 시도 - finally 블록 (보증 용)에 내 모든 Closeable 객체를 닫 것이다 :

이 효과의 무언가를.

+0

내가 전에 말했듯이, 내 이미지 크기가 5000 바이트 이상이되지 않을 것이므로 배열의 초기 크기가 5000 바이트를 읽는 데 충분할 정도로 루프를 읽을 필요가 없습니다. 응답 내용의 InputStream이 프로덕션 서버에서만 1984 바이트를 읽는 이유를 모르겠습니다. 예, 실제로 원본 코드가 너무 길어서 try-finally 블록이 있습니다. 단순함을 유지하기 위해 여기에 존재하지 않습니다. :-) – gopal

+0

'HttpResponse.getContentLength()'는 5000 바이트 이하의 길이를 반환하고 있습니까? –

+0

안녕하세요. 마침내 해결책을 얻었습니다. 내 프로덕션 서버의 미디어 내용은 기본적으로 GZ formate로 압축되어 이미지 압축을 풀면 문제가 해결되었습니다. – gopal

0

 
public int read(byte[] b) 
     throws IOException 

버퍼 배열 b에 입력 스트림로부터 바이트 일부 번호를 읽는다.


#read 메서드의 계약에 대한 이해가 잘못되었습니다. 읽기 메소드가 실제로 한 번의 호출로 전체 응답 내용을 검색한다는 보장은 없습니다. 하나는 스트림이 끝날 때까지 입력 스트림에서 읽기에 보관해야

관련 문제