2013-11-28 2 views
3

HttpClient 4.3.1을 사용하여 파일을 업로드하고 싶습니다. File 객체 대신 multipart inputstream을 추가하여 업로드 진행을 제어해야합니다. 이 내 코드입니다 : 방법 MultipartEntityBuilder.addBinaryBody (Strin, 파일) 작동을 사용Java Apache HttpClient가 파일을 업로드하는 중 오류가 발생했습니다.

 byte[] dump = ...; 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(SENDLOG_URL);  

     MultipartEntityBuilder meb = MultipartEntityBuilder.create(); 
     meb.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
     // THIS WORKS!! meb.addBinaryBody("log", new File("C:\\temp.zip"), ContentType.APPLICATION_OCTET_STREAM,"log.zip"); 
     InputStream is=new FileInputStream("C:\\temp.zip") 
     meb.addBinaryBody("log", is, ContentType.DEFAULT_BINARY, "log.zip");    
     httppost.setEntity(meb.build()); 
     HttpResponse resp=httpclient.execute(httppost); 
     is.close(); 

하지만 MultipartEntityBuilder.addBinaryBody (Strin,의 InputStream)를 사용하여 작동하지 않습니다.

자바 클라이언트는 모든 오류가 발생하지 않지만,이 원격 서버 (아파치)의 답변입니다 :

HTTP/1.1 400 잘못된 요청 [날짜 : 2013년 11월 28일 (목) 09 : 46:08 그리니치 표준시, 서버 : 아파치/2.4.6 (유닉스) mod_fcgid/2.3.7, 콘텐츠 길이 : 226, 연결 : 닫기, 콘텐츠 - 유형 : 텍스트/HTML; charset = iso-8859-1]

왜 새 파일()과 새 FileInputStream() 사이에 이상한 동작이 발생합니까?

+0

응답을받은 후 연결을 닫습니다. fos.close(); –

+0

FileOutputStream을 의미합니까? 정말로 이것을 무시할 수 있습니다. 단지 임시 파일에 쓰는 것입니다. – Tobia

+0

죄송합니다 ..... 입력 스트림의 인스턴스를 만들어 addBinaryBody 메서드에 전달하고 인스턴스를 사용하여 응답을 닫으면 –

답변

2

매우 간단합니다. 전자의 경우 다중 파트 엔티티 컨텐츠의 전체 길이는 모든 파트의 길이가 알려지면 계산 될 수 있습니다. 이러한 엔티티는 Content-Length 헤더로 구분 된 요청으로 묶을 수 있습니다. 후자의 경우 전체 엔티티 길이를 결정할 수 없으며 요청은 청크 코딩으로 전송됩니다. 분명히 프로토콜 준수가 제한된 일부 서버 측 스크립트는 Content-Length 헤더가없는 요청을 처리 할 수 ​​없습니다.

+0

콘텐츠 길이 (이 입력 스트림은 파일 스트림 임)를 알고 강제 할 수 있습니까? – Tobia

+0

org.apache.http.entity.mime.content.InputStreamBody를 확장하여 public long getContentLength() 메소드를 변경했습니다. 고맙습니다. – Tobia

+0

'InputStreamBody'를 확장하는 것 외에 다른 해결책이 있습니까? – ulab

관련 문제