1. ホーム
  2. android

[解決済み] HttpPostによる画像送信

2022-07-12 01:34:06

質問

アンドロイドクライアントからDjangoサーバーにHttpPostで画像を送りたいです。画像はギャラリーから選択されます。現在、私はサーバーに必要なデータを送信するためにリスト値名ペアを使用しており、JSONでDjangoから応答を受信しています。同じアプローチを画像に使うことはできますか (画像の URL を JSON のレスポンスに埋め込む)?

また、サーバからダウンロードせずにリモートで画像にアクセスする方法と、ダウンロードしてBitmap配列に格納し、ローカルで使用する方法、どちらが良いのでしょうか?画像は数が少なく(<10)、サイズも小さい(50*50 dip)です。

これらの問題に取り組むための任意のチュートリアルは、非常に高く評価されます。

編集:ギャラリーから選択された画像は、必要なサイズにスケーリングした後、サーバーに送信されます。

どのように解決するのですか?

アップロードしたい画像のパスとファイル名がわかっていることを前提に説明します。この文字列をあなたの NameValuePair を使って image をキー名とします。

画像の送信は HttpComponents ライブラリ . 最新の HttpClient をダウンロードします(現在 4.0.1 ) のバイナリを依存関係パッケージと一緒にダウンロードし apache-mime4j-0.6.jarhttpmime-4.0.1.jar をプロジェクトに追加し、Javaのビルドパスに追加してください。

クラスには以下のインポートを追加する必要があります。

import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;

これで MultipartEntity を作成して、POST リクエストに画像を添付することができます。次のコードは、その方法の例を示しています。

public void post(String url, List<NameValuePair> nameValuePairs) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(url);

    try {
        MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

        for(int index=0; index < nameValuePairs.size(); index++) {
            if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) {
                // If the key equals to "image", we use FileBody to transfer the data
                entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File (nameValuePairs.get(index).getValue())));
            } else {
                // Normal string data
                entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue()));
            }
        }

        httpPost.setEntity(entity);

        HttpResponse response = httpClient.execute(httpPost, localContext);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

これで少しは正しい方向に向かうといいのですが。