1. ホーム
  2. android

[解決済み] AndroidでVolleyを使ってmultipart/form-dataのPOSTを送信する方法

2023-03-31 01:51:50

質問

誰か multipart/form-data のPOST送信を実現された方はいらっしゃいますか?をアップロードしようとしてもうまくいきません。 image/png をサーバーに POST リクエストでアップロードすることに成功したことがないので、成功した人がいるかどうか知りたいと思っています。

これを行うためのデフォルトの方法は public byte[] getPostBody() の中で Request.java クラスをアタッチし File を追加し、境界の Header キーを空白にします。しかし、私のファイルを変換して String に対して Map<String, String> postParams に変換し、それを再びエンコードさせるのは難解で、あまりエレガントではありません。 また、私はこの試みに失敗しています。これが、このライブラリへの切り替えを躊躇させている唯一の理由です。

とにかく、すべての考えと回答は非常に感謝されます。助けていただきありがとうございます。

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

間違っているかも知れませんが、自分で実装する必要があると思います。 com.android.volley.toolbox.HttpStack を実装する必要があると思います。なぜなら、デフォルトのもの ( HurlStack というのは、バージョン > Gingerbread または HttpClientStack ) を処理しません。 multipart/form-data .

編集してください。

そして、確かに私は間違っていました。私はそれを使用することができました MultipartEntity を使うことができました。

public class MultipartRequest extends Request<String> {

    private MultipartEntity entity = new MultipartEntity();

    private static final String FILE_PART_NAME = "file";
    private static final String STRING_PART_NAME = "text";

    private final Response.Listener<String> mListener;
    private final File mFilePart;
    private final String mStringPart;

    public MultipartRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener, File file, String stringPart)
    {
        super(Method.POST, url, errorListener);

        mListener = listener;
        mFilePart = file;
        mStringPart = stringPart;
        buildMultipartEntity();
    }

    private void buildMultipartEntity()
    {
        entity.addPart(FILE_PART_NAME, new FileBody(mFilePart));
        try
        {
            entity.addPart(STRING_PART_NAME, new StringBody(mStringPart));
        }
        catch (UnsupportedEncodingException e)
        {
            VolleyLog.e("UnsupportedEncodingException");
        }
    }

    @Override
    public String getBodyContentType()
    {
        return entity.getContentType().getValue();
    }

    @Override
    public byte[] getBody() throws AuthFailureError
    {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try
        {
            entity.writeTo(bos);
        }
        catch (IOException e)
        {
            VolleyLog.e("IOException writing to ByteArrayOutputStream");
        }
        return bos.toByteArray();
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response)
    {
        return Response.success("Uploaded", getCacheEntry());
    }

    @Override
    protected void deliverResponse(String response)
    {
        mListener.onResponse(response);
    }
}

かなり生々しいですが、画像と簡単な文字列で試したところ、うまくいきました。レスポンスはプレースホルダーで、この場合Response Stringを返すのはあまり意味がない。MultipartEntityを使うのにapache httpmimeを使うと問題があったので、次のようにしました。 https://code.google.com/p/httpclientandroidlib/ を使いましたが、もっといい方法があるかどうかわかりません。 それが役立つことを願っています。

Edit

httpclientandroidlibを使わなくてもhttpmimeを使うことができます。依存関係はhttpcoreだけです。