2

I have following class, but don't know, how to resolve ContentType. Why cannot be used writeTo() method with created entity? I cannot write it to ByteOutputStream.

public class ImageUploadRequest<T> extends Request<T> {

    private static final String FILE_PART_NAME = "file";

    private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();
    private final Response.Listener<T> mListener;
    private final File mImageToUpload;
    protected Map<String, String> headers;

    public ImageUploadRequest(String uploadURL, Response.ErrorListener errorListener, Response.Listener<T> listener, File imageFileToUpload){
        super(Method.POST, uploadURL, errorListener);

        mListener = listener;
        mImageToUpload = imageFileToUpload;
        //call the helper method to build the multipart entity
        buildMultipartEntity();
    }

    @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("Accept", "application/json");

        return headers;
    }

    private void buildMultipartEntity(){
        mBuilder.addBinaryBody(FILE_PART_NAME, mImageToUpload, ContentType.create("image/jpeg"), mImageToUpload.getName());
        mBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        mBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
    }

    @Override
    public String getBodyContentType(){
        String contentTypeHeader = mBuilder.build().getContentType().getValue();
        return contentTypeHeader;
    }

    @Override
    public byte[] getBody() throws AuthFailureError{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            mBuilder.build().writeTo(bos);
        } catch (IOException e) {
            VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request.");
        }

        return bos.toByteArray();
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        T result = null;
        return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    protected void deliverResponse(T response) {
        mListener.onResponse(response);
    }
}
plaidshirt
  • 5,189
  • 19
  • 91
  • 181
  • i have custom method for upload pictures see my answer [here](http://stackoverflow.com/questions/36513174/android-multipart-image-upload-with-httpconnectionparams-deprecated-in-new-api/36513504#36513504) – mehrdad khosravi May 25 '16 at 09:16
  • @mehrdadkhosravi : It looks great, but I don't want to implement a new solution, only would like to fix existing one. – plaidshirt May 25 '16 at 09:21
  • @KovacsAkos please read my answer at http://stackoverflow.com/questions/32187450/trouble-sending-multipart-file-with-boundary-via-volley/32187557#32187557 to see if it can help or not – BNK May 28 '16 at 16:17
  • @BNK : That is okay, but what about server side code? – plaidshirt May 28 '16 at 16:31
  • @KovacsAkos http://www.asp.net/web-api/overview/advanced/sending-html-form-data-part-2 – BNK May 28 '16 at 16:48

0 Answers0