2012-04-19 73 views
7

Tôi đang sử dụng apache HttpClient để đăng một số tệp vào máy chủ. Dưới đây là các mã:Có thể ghép nối và ghép nối HTTP không?

public static HttpResponse stringResponsePost(String urlString, String content, byte[] image, 
     HttpContext localContext, HttpClient httpclient) throws Exception { 

    URL url = new URL(URLDecoder.decode(urlString, "utf-8")); 
    URI u = url.toURI(); 

    HttpPost post = new HttpPost(); 
    post.setURI(u); 

    MultipartEntity reqEntity = new MultipartEntity(); 
    StringBody sb = new StringBody(content, HTTP_CONTENT_TYPE_JSON, Charset.forName("UTF-8")); 
    ByteArrayBody ib = new ByteArrayBody(image, HTTP_CONTENT_TYPE_JPEG, "image"); 

    reqEntity.addPart("interview_data", sb); 
    reqEntity.addPart("interview_image", ib); 
    post.setEntity(reqEntity); 

    HttpResponse response = null; 
    response = httpclient.execute(post, localContext); 

    return response; 
} 

Vấn đề là, MultipartEntity lớp chỉ có isChunked() phương pháp (mà luôn luôn trả về false), không có "setChunked (boolean)" tùy chọn nếu tôi muốn kích hoạt mã hóa chucked cho tổ chức nhiều phần dữ liệu của tôi.

Câu hỏi của tôi là:

  1. thể HTTP cùng tồn tại nhiều phần dữ liệu và chunking theo đặc điểm kỹ thuật giao thức? Nếu không, tại sao các thực thể khác như InputStreamEntity lớp học có setChunked(boolean) trong đó MultipartEntity thì không?

  2. Có cách nào để đăng nhiều tệp "cùng một lúc" với chunking được bật hay không, tốt hơn nữa là với thư viện apache?

Trả lời

8

Got một giải pháp cho câu hỏi thứ hai của tôi, Bí quyết là để viết MultipartEntity đến một ByteArrayOutputStream, tạo một ByteArrayEntity từ ByteArrayOutputStream và cho phép chunking về điều đó. Đây là mã:

ByteArrayOutputStream bArrOS = new ByteArrayOutputStream(); 
    // reqEntity is the MultipartEntity instance 
    reqEntity.writeTo(bArrOS); 
    bArrOS.flush(); 
    ByteArrayEntity bArrEntity = new ByteArrayEntity(bArrOS.toByteArray()); 
    bArrOS.close(); 

    bArrEntity.setChunked(true); 
    bArrEntity.setContentEncoding(reqEntity.getContentEncoding()); 
    bArrEntity.setContentType(reqEntity.getContentType()); 

    // Set ByteArrayEntity to HttpPost 
    post.setEntity(bArrEntity);