how to perform file upload using Volley in android

2019-07-24 19:04发布

I want to upload files(images,documents etc) from my android application to my server.I'm using Volley library for network calls in my application.

I'm using the following code to upload files but it is not performing any operation.(showing volley timeout error finally)

public class MultipartRequest extends Request<String> {

    private MultipartEntity entity = new MultipartEntity();

    private static final String FILE_PART_NAME = "file";


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

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

        mListener = listener;
        mFilePart = file;
        this.accessToken = accessToken;
        buildMultipartEntity();
    }

    private void buildMultipartEntity()
    {
        entity.addPart(FILE_PART_NAME, new FileBody(mFilePart));
        try
        {
            entity.addPart("Content-Disposition", new StringBody("form-data"));
            entity.addPart("dir_path", new StringBody("IzEzOjE3"));
        }
        catch (UnsupportedEncodingException e)
        {
            VolleyLog.e("UnsupportedEncodingException");
        }
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = super.getHeaders();

        if (headers == null
                || headers.equals(Collections.emptyMap())) {
            headers = new HashMap<String, String>();
        }

        headers.put("Content-Type", "multipart/form-data");
        headers.put("_pkta",accessToken);


        return headers;
    }
    @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);
    }
}

please help me on how to implement file upload in android(either by volley or any other)

1条回答
家丑人穷心不美
2楼-- · 2019-07-24 19:26

Try

public MultiPartRequest(String url, String filePath, Response.Listener<String> listener, Response.ErrorListener errorListener)
{
    super(Method.POST, url, errorListener);
    entity = new  MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    file = new File(filePath);
    mListener = listener;
    buildMultipartEntity();
}

also, in my case I didn't override getHeaders, just passed other values with addPart, e.g:

    entity.addPart("file", new FileBody(file, "image/jpeg")); // for image
    entity.addPart("id", new StringBody(userid));

hope this helps.

查看更多
登录 后发表回答