Problema ao enviar arquivo de várias partes com limite via voleibol

Eu tenho uma chamada HTTP de clientes trabalhando usando as classes apache padrão, mas estou tentando criar uma classe Volley personalizada para lidar com isso. Aqui está o código para a chamada padrão:

HttpURLConnection conn = (HttpURLConnection) new URL(strUrl).openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setConnectTimeout(30000);
conn.setUseCaches(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "Token " + m_apiKey);
conn.setRequestProperty("Accept", "text/plain , application/json");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + strBoundary);
conn.connect();


// **** Start content wrapper:
DataOutputStream request = new DataOutputStream(conn.getOutputStream());

request.writeBytes("\r\n--" + strBoundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"" + attachmentName + "\";filename=\"" + imageFileName + "\"" + "\r\n");
request.writeBytes("Content-Type: image/jpeg " + "\r\n");
request.writeBytes("\r\n");
request.write(baos.toByteArray());

// **** End content wrapper:
request.writeBytes("\r\n--"+ strBoundary + "--\r\n");

// Flush output buffer:
request.flush();request.close();

Não sei como fazer o resto, mas é isso que tenho para o Volley que não está funcionando. Eu já fiz Multipart antes, mas não com limite e neste formato estranho.

classe pública ImageMultiRequest estende StringRequest {final String BOUNDARY = "something"; String final crlf = "\ r \ n"; String final twoHyphens = "-";

private final MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();

private Response.Listener<String> mListener = null;
private Response.ErrorListener mEListener;
//
private final File mFilePart;
private Map<String, String> parameters;
private Map<String, String> header;
MultipartEntity entity = new MultipartEntity();
protected String apiKey;
ByteArrayOutputStream bos;

public ImageMultiRequest(String apiKey, String url, Listener<String> rListener, ErrorListener eListener, File file) {
    super(Method.POST, url, rListener, eListener);
    setShouldCache(false);
    this.apiKey = apiKey;
    this.bos = bos;
    mListener = rListener;
    mEListener = eListener;
    mFilePart = file;
    entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    entityBuilder.setBoundary(BOUNDARY);
    buildMultipartEntity();
}

@Override
public String getBodyContentType() {
    return "multipart/form-data; boundary=" + BOUNDARY + "; charset=utf-8";
}

/**
 * Overrides the base class to add the Accept: application/json header
 */
@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;boundary=" + BOUNDARY+ "; charset=utf-8");
    headers.put("Connection", "Keep-Alive");
    headers.put("Accept", "text/plain , application/json");
    headers.put("Authorization", "Token " + apiKey);
    return headers;
}

@Override
public byte[] getBody() throws AuthFailureError {
    buildMultipartEntity();

    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    try {
        entityBuilder.build().writeTo(bos);
    } catch (IOException e) {
        VolleyLog.e("IOException writing to ByteArrayOutputStream");
    }
    return bos.toByteArray();
}

private void buildMultipartEntity() {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    entityBuilder.addPart("Content-Type: image/jpeg " + crlf + crlf, new ByteArrayBody(bos.toByteArray(), "car"));

  }
}

===================================================

SOLUÇÃO Com base na resposta abaixo

Aqui está o que eu criei que funcionou para isso e possivelmente outros problemas com o arquivo de várias partes incorporado ao Corpo do Conteúdo

package com.cars.android.common.volley;

import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.StringRequest;

import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;

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

public class ImageMultiRequest extends StringRequest {
    final String BOUNDARY = "myboundary";

    private final MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
    HttpEntity entity = new MultipartEntity();

    private Response.Listener<String> mListener = null;
    private Response.ErrorListener mEListener;
    //
    private final File mFilePart;
    protected String apiKey;

    public ImageMultiRequest(String apiKey, String url, Listener<String> rListener, ErrorListener eListener, File file) {
        super(Method.POST, url, rListener, eListener);
        setShouldCache(false);
        this.apiKey = apiKey;
        mListener = rListener;
        mEListener = eListener;
        mFilePart = file;
        entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        entityBuilder.setBoundary(BOUNDARY);

        ContentType contentType = ContentType.create("image/png");
        entityBuilder.addBinaryBody("file", file, contentType, "car");
        entity = entityBuilder.build();
    }

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

    /**
     * Overrides the base class to add the Accept: application/json header
     */
    @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;boundary=" + BOUNDARY+ "; charset=utf-8");
        headers.put("Connection", "Keep-Alive");
        headers.put("Accept", "text/plain , application/json");
        headers.put("Authorization", "Token " + apiKey);
        return headers;
    }

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

}

questionAnswers(1)

yourAnswerToTheQuestion