2011-08-02 20 views
11

HTTP kullanarak bir Servlet'e bir dosya yüklemesi gereken bir J2ME istemcisi geliştiriyorum.Java Http İstemcisi POST üzerinden dosya yüklemek için

servlet parçası Apache Commons FileUpload

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
{  

    ServletFileUpload upload = new ServletFileUpload(); 
    upload.setSizeMax(1000000); 

    File fileItems = upload.parseRequest(request); 

    // Process the uploaded items 
    Iterator iter = fileItems.iterator(); 
    while (iter.hasNext()) { 
     FileItem item = (FileItem) iter.next(); 
     File file = new File("\files\\"+item.getName()); 
     item.write(file); 
    } 
} 

Commons yükle sadece çok parçalı dosya yüklemek mümkün görünmektedir kullanarak örtülü, ancak hiçbir uygulama/octect-stream edilir.

Ama istemci tarafı için

ne, bu durumda, herhangi HttpClient kütüphaneyi kullanmak mümkündür, hiçbir Çok parçalı sınıflar vardır.

Diğer seçenek HTTP Chunk yüklemesi yapmak için olabilir, ama ben özel olarak servlet tarafında, bu nasıl yansıdığını da açık bir örneğini bulamadım.

Benim seçimler şunlardır: - http yığın yükleme için servlet uygulanması - http çok parçalı oluşturma için ham müşteri Uygulamak

Ben yukarıdaki seçeneklerden hiçbiri nasıl uygulanacağı bilmiyorum. Herhangi bir öneri?

cevap

0

Gory detaylarını girmeden kodunuz iyi görünüyor.

Artık sunucu tarafına ihtiyacınız var. Jakarta FileUpload'u kullanmanızı tavsiye ederim, böylece herhangi bir şey uygulamak zorunda değilsiniz. Sadece dağıt ve yapılandır. HTTP üzerinden

+5

soruyu okudun (cevap artık önerilmemektedir MultipartEntity kullanır Üstü) HTTP istemci 4.x ile dosya yüklemek için kullanılabilir? Gönderi kod **, zaten FileUpload kullanan sunucu tarafıdır. – BalusC

29

gönderme dosyalar multipart/form-data kodlamasını kullanarak gerçekleşmesi beklenir. Servlet bölümünüz, multipart/form-data isteğini ayrıştırmak için zaten Apache Commons FileUpload kullandığı için iyidir. Eğer görünüşte istek vücuda ham dosya içeriğini yazıyoruz

Müşteriniz parçası, ancak, görünüşe göre iyi değil. Müşterinizin uygun bir multipart/form-data isteği göndermesini sağlamanız gerekir. Tam olarak nasıl yapılacağı, HTTP isteğini göndermek için kullandığınız API'ye bağlıdır. Düz vanilya java.net.URLConnection ise, o zaman this answer dibine yakın bir yerde somut bir örnek bulabilirsiniz. Bunun için Apache HttpComponents Client kullanıyorsanız, o zaman burada somut bir örnek:

File file = new File("\files\\"+item.getName()); 
item.write(file); 

Bu: Beton sorununa

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost(url); 

MultipartEntity entity = new MultipartEntity(); 
entity.addPart("file", new FileBody(file)); 
post.setEntity(entity); 

HttpResponse response = client.execute(post); 
// ... 

İlgisiz, sunucu tarafı kodunda bir hata var Aynı adı taşıyan daha önce yüklenen herhangi bir dosyanın üzerine yazılacak. Bunun yerine File#createTempFile() kullanmayı öneririm.

String name = FilenameUtils.getBaseName(item.getName()); 
String ext = FilenameUtils.getExtension(item.getName()); 
File file = File.createTempFile(name + "_", "." + ext, new File("/files")); 
item.write(file); 
+0

Bu dosya sunucusu tarafını örneğin requset kullanarak nasıl edinebilirim.getParameter biz dize değerleri olsun dosya kütük dosya hakkında ne olsun ... – Aniket

+0

@Aniket: Sadece normal bir HTML formu kullandığınız gibi. – BalusC

+4

[MultipartEntity] (http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntity.html) artık kullanımdan kaldırılmıştır. –

0

Kesilen tüm kodlar için teşekkürler ... sniped ... İşte biraz geri.

Gradle 

compile "org.apache.httpcomponents:httpclient:4.4" 
compile "org.apache.httpcomponents:httpmime:4.4" 



import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.StringWriter; 
import java.util.Map; 

import org.apache.commons.io.IOUtils; 
import org.apache.http.HttpEntity; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.CloseableHttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.ContentType; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.entity.mime.content.StringBody; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 


public class HttpClientUtils { 

    public static String post(String postUrl, Map<String, String> params, 
      Map<String, String> files) throws ClientProtocolException, 
      IOException { 
     CloseableHttpResponse response = null; 
     InputStream is = null; 
     String results = null; 
     CloseableHttpClient httpclient = HttpClients.createDefault(); 

     try { 

      HttpPost httppost = new HttpPost(postUrl); 

      MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 

      if (params != null) { 
       for (String key : params.keySet()) { 
        StringBody value = new StringBody(params.get(key), 
          ContentType.TEXT_PLAIN); 
        builder.addPart(key, value); 
       } 
      } 

      if (files != null && files.size() > 0) { 
       for (String key : files.keySet()) { 
        String value = files.get(key); 
        FileBody body = new FileBody(new File(value)); 
        builder.addPart(key, body); 
       } 
      } 

      HttpEntity reqEntity = builder.build(); 
      httppost.setEntity(reqEntity); 

      response = httpclient.execute(httppost); 
      // assertEquals(200, response.getStatusLine().getStatusCode()); 

      HttpEntity entity = response.getEntity(); 
      if (entity != null) { 
       is = entity.getContent(); 
       StringWriter writer = new StringWriter(); 
       IOUtils.copy(is, writer, "UTF-8"); 
       results = writer.toString(); 
      } 

     } finally { 
      try { 
       if (is != null) { 
        is.close(); 
       } 
      } catch (Throwable t) { 
       // No-op 
      } 

      try { 
       if (response != null) { 
        response.close(); 
       } 
      } catch (Throwable t) { 
       // No-op 
      } 

      httpclient.close(); 
     } 

     return results; 
    } 

    public static String get(String getStr) throws IOException, 
      ClientProtocolException { 
     CloseableHttpResponse response = null; 
     InputStream is = null; 
     String results = null; 
     CloseableHttpClient httpclient = HttpClients.createDefault(); 

     try { 
      HttpGet httpGet = new HttpGet(getStr); 
      response = httpclient.execute(httpGet); 

      assertEquals(200, response.getStatusLine().getStatusCode()); 

      HttpEntity entity = response.getEntity(); 
      if (entity != null) { 
       is = entity.getContent(); 
       StringWriter writer = new StringWriter(); 
       IOUtils.copy(is, writer, "UTF-8"); 
       results = writer.toString(); 
      } 

     } finally { 

      try { 
       if (is != null) { 
        is.close(); 
       } 
      } catch (Throwable t) { 
       // No-op 
      } 

      try { 
       if (response != null) { 
        response.close(); 
       } 
      } catch (Throwable t) { 
       // No-op 
      } 

      httpclient.close(); 
     } 

     return results; 
    } 

} 
0

ardından kod

String uploadFile(String url, File file) throws IOException 
{ 
    HttpPost post = new HttpPost(url); 
    post.setHeader("Accept", "application/json"); 
    _addAuthHeader(post); 
    MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
    // fileParamName should be replaced with parameter name your REST API expect. 
    builder.addPart("fileParamName", new FileBody(file)); 
    //builder.addPart("optionalParam", new StringBody("true", ContentType.create("text/plain", Consts.ASCII))); 
    post.setEntity(builder.build()); 
    HttpResponse response = getClient().execute(post);; 
    int httpStatus = response.getStatusLine().getStatusCode(); 
    String responseMsg = EntityUtils.toString(response.getEntity(), "UTF-8"); 

    // If the returned HTTP response code is not in 200 series then 
    // throw the error 
    if (httpStatus < 200 || httpStatus > 300) { 
     throw new IOException("HTTP " + httpStatus + " - Error during upload of file: " + responseMsg); 
    } 

    return responseMsg; 
}