30

アプリの Web リクエストを呼び出すために Volley を使用しています。でもボレーは初めてです。マルチパートを使用してボレー経由で画像/ビデオ メディア データをアップロードする方法を知りたいだけです。

私はそれを多くのサイトで検索しましたが、いくつかの結果が得られました

Android で Volley を使用して「multipart/form-data」POST を送信する方法

しかし、これらの方法は見栄えも効率も良くありません。ボレーを使用してメディアデータをアップロードする方法を教えてください。または、ボレーを使用するべきではなく、以前の手動アプローチを使用する必要があります

とにかく、すべての考えと答えは非常に高く評価されています。ご協力ありがとうございました。

4

2 に答える 2

30

答えが得られたかどうかはわかりませんが、これを試していない場合:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyLog;

public class MultipartRequest extends Request<String> {

// private MultipartEntity entity = new MultipartEntity();

MultipartEntityBuilder entity = MultipartEntityBuilder.create();
HttpEntity httpentity;
private static final String FILE_PART_NAME = "file";

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

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

    mListener = listener;
    mFilePart = file;
    this.mStringPart = mStringPart;
    entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    buildMultipartEntity();
}

public void addStringBody(String param, String value) {
    mStringPart.put(param, value);
}

private void buildMultipartEntity() {
    entity.addPart(FILE_PART_NAME, new FileBody(mFilePart));
    for (Map.Entry<String, String> entry : mStringPart.entrySet()) {
        entity.addTextBody(entry.getKey(), entry.getValue());
    }
}

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

@Override
public byte[] getBody() throws AuthFailureError {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        httpentity = entity.build();
        httpentity.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);
}
   }

それを機能させるには、この Java httpclients を使用する必要があります: http://hc.apache.org/downloads.cgi この回答を書いている時点 (02/07/14) で、使用しているバージョンは 4.3 です。 .2.

それが役に立てば幸い !

于 2014-02-07T19:03:35.207 に答える