2011-08-02 22 views
11

HTTPを使用してファイルをサーブレットにアップロードする必要があるJ2MEクライアントを開発しています。POST経由でファイルをアップロードするJava Httpクライアント

サーブレットの一部がApacheのコモンズの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); 
    } 
} 

コモンズアップロードのみマルチパートファイルをアップロードすることができるようですが、ないアプリケーション/オクテットストリーム。

クライアント側では、Multipartクラスはありません。この場合、いずれのHttpClientライブラリも使用できません。

その他のオプションは、HTTPチャンクのアップロードを使用することができますが、特にこれがサーブレット側でどのように実装できるかの明確な例は見つかりませんでした。

私の選択肢は次のとおりです。 - HTTPチャンクのアップロード のサーブレットを実装する - HTTPマルチパートの作成のための生のクライアントを実装

私は上記のオプションのどれを実装しないのか分かりません。 提案がありますか?

答えて

0

あなたのコードはうまくいきます。

ここでサーバー側が必要です。 Jakarta FileUploadを使用することをお勧めしますので、何も実装する必要はありません。デプロイして設定するだけです。

+5

は、あなたが質問を読みました(答えは廃止されMultipartEntityを使用しています上)HTTPクライアント4.xのにファイルをアップロードするために使用することができますか?投稿されたコード**は既にFileUploadを利用しているサーバー側です。 – BalusC

29

HTTP経由でファイルを送信するには、multipart/form-dataエンコーディングを使用する必要があります。 Apache Commons FileUploadを使用してmultipart/form-dataリクエストを解析するので、サーブレットの部分は問題ありません。

あなたのクライアントの部分は、見た目が悪いように見えますが、ファイル本体の内容をリクエスト本体に書き込んでいるようです。クライアントが適切なmultipart/form-dataリクエストを送信することを確認する必要があります。どのように行うかは、HTTPリクエストを送信するために使用しているAPIによって異なります。プレーンなバニラの場合java.net.URLConnection、具体的な例はthis answerの下のどこかにあります。あなたはこのためApache HttpComponents Clientを使用している場合は、ここでの具体的な例を示します

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

この:具体的な問題へ

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); 
// ... 

無関係、サーバー側のコードにバグがあります以前にアップロードされたファイルを同じ名前で上書きする可能性があります。代わりにFile#createTempFile()を使用することをお勧めします。

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

requsetを使用してこのファイルサーバー側を取得するにはどうすればよいですか。getParameter私たちは文字列の値を取得するので、ファイル本体のファイルはどうですか? – Aniket

+0

@Aniket:通常のHTMLフォームを使用する場合とまったく同じです。 – BalusC

+4

[MultipartEntity](http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntity.html)は廃止予定です。 –

0

すべてのコードのおかげで、私は狙った。

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

次のコードは、

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; 
} 
関連する問題