10

Android アプリの一部として、ビットマップをアップロードしてリモートに保存したいと考えています。単純な HTTP GET および POST 通信は完全に機能していますが、マルチパート POST の実行方法に関するドキュメントはユニコーンと同じくらい珍しいようです。

さらに、ファイルを操作するのではなく、メモリから直接画像を送信したいと思います。以下のコード例では、後で HttpClient と MultipartEntity で使用するためにファイルからバイト配列を取得しています。

    File input = new File("climb.jpg");
    byte[] data = new byte[(int)input.length()];
    FileInputStream fis = new FileInputStream(input);
    fis.read(data);

    ByteArrayPartSource baps = new ByteArrayPartSource(input.getName(), data);

これは、この ByteArrayPartSource をどこで取得するかを一生見つけることができないことを除いて、私にはかなり明確に思えます。httpclient および httpmime JAR ファイルにリンクしましたが、サイコロはありません。HttpClient 3.x と 4.x でパッケージ構造が大きく変わったと聞いています。

AndroidでこのByteArrayPartSourceを使用している人はいますか?どのようにインポートしましたか?

ドキュメントを掘り下げ、インターネットを精査した後、自分のニーズに合ったものを思いつきました。フォーム POST などのマルチパート リクエストを作成するには、次のコードでうまくいきました。

    File input = new File("climb.jpg");

    DefaultHttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("http://localhost:3000/routes");
    MultipartEntity multi = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    String line;

    multi.addPart("name", new StringBody("test"));
    multi.addPart("grade", new StringBody("test"));
    multi.addPart("quality", new StringBody("test"));
    multi.addPart("latitude", new StringBody("40.74"));
    multi.addPart("longitude", new StringBody("40.74"));
    multi.addPart("photo", new FileBody(input));
    post.setEntity(multi);

    HttpResponse resp = client.execute(post);

HTTPMultipartMode.BROWSER_COMPATIBLE ビットは非常に重要です。これに関するRadomir のブログに感謝します。

4

3 に答える 3

2

これを試して:

 HttpClient httpClient = new DefaultHttpClient() ;

 HttpPost httpPost = new HttpPost("http://example.com");
 MultipartEntity entity = new MultipartEntity();     
 entity.addPart("file", new FileBody(file));
 httpPost.setEntity(entity );
 HttpResponse response = null;

 try {
     response = httpClient.execute(httpPost);
 } catch (ClientProtocolException e) {
     Log.e("ClientProtocolException : "+e, e.getMessage());         
 } catch (IOException e) {
     Log.e("IOException : "+e, e.getMessage());

 } 
于 2010-11-04T18:42:44.520 に答える
1

おそらく、次の手順でライブラリをAndroidにインポートできます。

要件ライブラリ-apache-mime4j-0.6.jar-httpmime-4.0.1.jar

  1. プロジェクトを右クリックし、プロパティをクリックします
  2. Javaビルドパスを選択します
  3. 「注文とエクスポート」というタブを選択します
  4. それを適用する
  5. 既存のapkが新しいライブラリに対応していないため、adbアンインストールでapkファイルを完全にアンインストールします
  6. あなたのapkを再インストールしてください
  7. それを実行します

ありがとう、

ジェンツ

于 2012-09-26T18:28:10.220 に答える
0

私も同じ問題を抱えています。MultiPart Entityを介して画像をアップロードしようとしていますが、HttpClient/MIMEのいくつかの更新ですべてがクラックされていることがわかります。次のコードを試していますが、エラー「NoClassDefFoundError」が発生します。

public static void executeMultipartPost(File image, ArrayList<Cookie> cookies, String myUrlToPost) {
    try {
        // my post instance
        HttpPost httppost = new HttpPost(myUrlToPost);
        // setting cookies for the connection session
        if (cookies != null && cookies.size() > 0) {
            String cookieString = "";
            for (int i=0; i<cookies.size(); ++i) {
                cookieString += cookies.get(i).getName()+"="+cookies.get(i).getValue()+";";
            }
            cookieString += "domain=" + BaseUrl + "; " + "path=/";
            httppost.addHeader("Cookie", cookieString);
        }
        // creating the http client
        HttpClient httpclient = new DefaultHttpClient();
        // creating the multientity part [ERROR OCCURS IN THIS BELLOW LINE]
        MultipartEntity multipartEntity = new MultipartEntity();
        multipartEntity.addPart("photoupload", new FileBody(image));
        httppost.setEntity(multipartEntity);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();
    } catch (Exception e) {}
}

このメソッドは完全にコンパイル可能で、httpclient-4.0.1.jarおよびhttpmime-4.2.jarライブラリを使用しますが、コメント行でクラッシュすることを覚えています。

于 2012-06-05T16:16:11.203 に答える