Tesis 1.0.0
Loading...
Searching...
No Matches
VolleyMultipartRequest.java
Go to the documentation of this file.
1package com.example.food_front.utils;
2
3import android.util.Log;
4
5import com.android.volley.AuthFailureError;
6import com.android.volley.NetworkResponse;
7import com.android.volley.ParseError;
8import com.android.volley.Request;
9import com.android.volley.Response;
10import com.android.volley.VolleyError;
11import com.android.volley.toolbox.HttpHeaderParser;
12
13import org.json.JSONException;
14import org.json.JSONObject;
15
16import java.io.ByteArrayInputStream;
17import java.io.ByteArrayOutputStream;
18import java.io.DataOutputStream;
19import java.io.IOException;
20import java.io.UnsupportedEncodingException;
21import java.util.HashMap;
22import java.util.Map;
23
24public class VolleyMultipartRequest extends Request<NetworkResponse> {
25 private final String twoHyphens = "--";
26 private final String lineEnd = "\r\n";
27 private final String boundary = "apiclient-" + System.currentTimeMillis();
28
29 private Response.Listener<NetworkResponse> mListener;
30 private Response.ErrorListener mErrorListener;
31 private Map<String, String> mHeaders;
32
36 private Map<String, DataPart> mByteDataParams;
37
41 public VolleyMultipartRequest(int method, String url,
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<>();
49 }
50
54 @Override
55 public Map<String, String> getHeaders() throws AuthFailureError {
56 return mHeaders;
57 }
58
62 public void addHeader(String key, String value) {
63 mHeaders.put(key, value);
64 }
65
74 public void addByteData(String key, byte[] data, String filename, String mimeType) {
75 mByteDataParams.put(key, new DataPart(filename, data, mimeType));
76 }
77
78 @Override
79 protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
80 try {
81 String jsonString = new String(response.data,
82 HttpHeaderParser.parseCharset(response.headers));
83
84 Log.d("VolleyMultipart", "Response: " + jsonString);
85
86 return Response.success(response,
87 HttpHeaderParser.parseCacheHeaders(response));
88 } catch (UnsupportedEncodingException e) {
89 return Response.error(new ParseError(e));
90 }
91 }
92
93 @Override
94 protected VolleyError parseNetworkError(VolleyError volleyError) {
95 return super.parseNetworkError(volleyError);
96 }
97
98 @Override
99 protected void deliverResponse(NetworkResponse response) {
100 mListener.onResponse(response);
101 }
102
106 @Override
107 public String getBodyContentType() {
108 return "multipart/form-data;boundary=" + boundary;
109 }
110
111 @Override
112 public byte[] getBody() throws AuthFailureError {
113 ByteArrayOutputStream bos = new ByteArrayOutputStream();
114 DataOutputStream dos = new DataOutputStream(bos);
115
116 try {
117 // AƱade datos en formato byte
118 for (Map.Entry<String, DataPart> entry : mByteDataParams.entrySet()) {
119 buildDataPart(dos, entry.getValue(), entry.getKey());
120 }
121
122 // Cierra la solicitud multipart
123 dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
124
125 return bos.toByteArray();
126 } catch (IOException e) {
127 e.printStackTrace();
128 }
129 return null;
130 }
131
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);
142
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];
148
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);
155 }
156
157 dataOutputStream.writeBytes(lineEnd);
158 }
159
163 public class DataPart {
164 private String fileName;
165 private byte[] content;
166 private String type;
167
168 public DataPart(String name, byte[] data, String mimeType) {
169 fileName = name;
170 content = data;
171 type = mimeType;
172 }
173
174 public String getFileName() {
175 return fileName;
176 }
177
178 public byte[] getContent() {
179 return content;
180 }
181
182 public String getType() {
183 return type;
184 }
185 }
186}
VolleyMultipartRequest(int method, String url, Response.Listener< NetworkResponse > listener, Response.ErrorListener errorListener)
void addByteData(String key, byte[] data, String filename, String mimeType)
Response< NetworkResponse > parseNetworkResponse(NetworkResponse response)