25 private final String twoHyphens =
"--";
26 private final String lineEnd =
"\r\n";
27 private final String boundary =
"apiclient-" + System.currentTimeMillis();
29 private Response.Listener<NetworkResponse> mListener;
30 private Response.ErrorListener mErrorListener;
31 private Map<String, String> mHeaders;
36 private Map<String, DataPart> mByteDataParams;
42 Response.Listener<NetworkResponse> listener,
43 Response.ErrorListener errorListener) {
44 super(method, url, errorListener);
45 this.mListener = listener;
46 this.mErrorListener = errorListener;
47 mByteDataParams =
new HashMap<>();
48 mHeaders =
new HashMap<>();
55 public Map<String, String>
getHeaders() throws AuthFailureError {
63 mHeaders.put(key, value);
74 public void addByteData(String key,
byte[] data, String filename, String mimeType) {
75 mByteDataParams.put(key,
new DataPart(filename, data, mimeType));
81 String jsonString =
new String(response.data,
82 HttpHeaderParser.parseCharset(response.headers));
84 Log.d(
"VolleyMultipart",
"Response: " + jsonString);
86 return Response.success(response,
87 HttpHeaderParser.parseCacheHeaders(response));
88 }
catch (UnsupportedEncodingException e) {
89 return Response.error(
new ParseError(e));
95 return super.parseNetworkError(volleyError);
100 mListener.onResponse(response);
108 return "multipart/form-data;boundary=" + boundary;
112 public byte[]
getBody() throws AuthFailureError {
113 ByteArrayOutputStream bos =
new ByteArrayOutputStream();
114 DataOutputStream dos =
new DataOutputStream(bos);
118 for (Map.Entry<String,
DataPart> entry : mByteDataParams.entrySet()) {
119 buildDataPart(dos, entry.getValue(), entry.getKey());
123 dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
125 return bos.toByteArray();
126 }
catch (IOException e) {
135 private void buildDataPart(DataOutputStream dataOutputStream, DataPart dataPart, String inputName)
throws IOException {
136 dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
137 dataOutputStream.writeBytes(
"Content-Disposition: form-data; name=\"" +
138 inputName +
"\"; filename=\"" + dataPart.getFileName() +
"\"" + lineEnd);
139 dataOutputStream.writeBytes(
"Content-Type: " + dataPart.getType() + lineEnd);
140 dataOutputStream.writeBytes(
"Content-Transfer-Encoding: binary" + lineEnd);
141 dataOutputStream.writeBytes(lineEnd);
143 ByteArrayInputStream fileInputStream =
new ByteArrayInputStream(dataPart.getContent());
144 int bytesAvailable = fileInputStream.available();
145 int maxBufferSize = 1024 * 1024;
146 int bufferSize = Math.min(bytesAvailable, maxBufferSize);
147 byte[] buffer =
new byte[bufferSize];
149 int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
150 while (bytesRead > 0) {
151 dataOutputStream.write(buffer, 0, bufferSize);
152 bytesAvailable = fileInputStream.available();
153 bufferSize = Math.min(bytesAvailable, maxBufferSize);
154 bytesRead = fileInputStream.read(buffer, 0, bufferSize);
157 dataOutputStream.writeBytes(lineEnd);
164 private String fileName;
165 private byte[] content;
168 public DataPart(String name,
byte[] data, String mimeType) {