android - 如何使用 Volley 在 Android 中发送 “multipart/form-data” POST

标签 android http android-volley

有没有人能够完成发送 multipart/form-data使用 Volley 在 Android 中发布 POST 了吗?我尝试上传 image/png 没有成功对我们的服务器使用 POST 请求,我很好奇是否有人有。

我相信执行此操作的默认方法是覆盖 public byte[] getPostBody()Request.java上课并附上File那里有一个空白的标题键作为边界。但是,将我的文件转换为 String对于Map<String, String> postParams然后再次对其进行编码似乎很迟钝,而且不是很优雅。我的尝试也没有成功。这确实是我们切换到这个库的唯一障碍。

无论如何,所有的想法和答案都非常感谢。谢谢您的帮助。

最佳答案

我可能错了,但我认为您需要为此实现自己的 com.android.volley.toolbox.HttpStack 因为默认的 (HurlStack if version > Gingerbread 或 HttpClientStack) 不处理 multipart/form-data

编辑:

确实我错了。我能够在 Request 中使用 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);
    }
}

它很原始,但我用一张图片和一个简单的字符串尝试了它,它可以工作。响应是一个占位符,在这种情况下返回响应字符串没有多大意义。我在使用 apache httpmime 来使用 MultipartEntity 时遇到问题,所以我使用了 https://code.google.com/p/httpclientandroidlib/不知道有没有更好的办法。 希望对您有所帮助。

编辑

你可以不使用httpclientandroidlib而使用httpmime,唯一的依赖是httpcore。

关于android - 如何使用 Volley 在 Android 中发送 “multipart/form-data” POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16797468/

相关文章:

android - Dagger2- 切换不同风格的依赖关系 : Android Studio

android - Drive-API 上的 "onConnectionSuspended "何时被调用,如何处理?

java - 如何四舍五入经度和纬度值

c - 如何用 curl 做 keepalive http 请求?

java - 安卓 Volley : select data from MySQL database by id specified by user

android - Android 总是使用 "tinyALSA"吗?

delphi - 通过 Delphi 和 Indy 10 TIdHTTP 获取 WebDAV 内容

ios - 使用 NSURLSession 进行 HTTP 基本身份验证

Android Volley NetworkImageView 不适用于某些图像

java - 使用 Volley 在 Android 中上传视频