Android Volley Extension Realizes File Upload Function Supporting Progress Bar
- 2021-10-27 09:11:56
- OfStack
volley is a lightweight open source network communication framework. The advantage of open source is that you can freely customize your own jar package. In volley, HttpUrlConnection is used above android 2.3 and HttpClient is used below 2.3. The changes I made only consider above 2.3, and do not support below 2.3 version. By default, HttpUrlConnection transmits data by writing all the data into memory and then sending it to the server. Volley adopts the default method, so it is easy to upload out of memory when uploading large files. One solution is to set the size of each transport stream:
Known file size: connection. setFixedLengthStreamingMode (long l);
File size unknown: connection. setChunkedStreamingMode (1024); //Recommended
android's file upload 1 is generally a simulated form, or it can be directly transmitted by socket. I have integrated form upload here. The following are key classes:
public class MultipartRequest extends Request<String> {
private final Listener<String> mListener;
private Map<String, String> headerMap;
private Map<String, String> mParams;
private FormFile[] files;
private String BOUNDARY = "---------7dc05dba8f3e19";
public MultipartRequest(String url, Listener<String> listener, Map<String, String> params, FormFile[] files) {
this(Method.POST, url, listener, params, files);
}
public MultipartRequest(int method, String url, Listener<String> listener, Map<String, String> params, FormFile[] files) {
super(method, url, listener);
mListener = listener;
mParams = params;
this.files = files;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
headerMap = new HashMap<String, String>();
headerMap.put("Charset", "UTF-8");
//Keep-Alive
headerMap.put("Connection", "Keep-Alive");
headerMap.put("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
return headerMap;
}
@Override
public byte[] getBody() throws AuthFailureError {
// Transmission parameter
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : mParams.entrySet()) {
// Build form field content
sb.append("--");
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n");
sb.append(entry.getValue());
sb.append("\r\n");
}
return sb.toString().getBytes();
}
@Override
public void handRequest(OutputStream out) {
DataOutputStream dos = (DataOutputStream) out;
try {
// Send file data
if (files != null) {
for (FormFile file : files) {
// Send file data
StringBuilder split = new StringBuilder();
split.append("--");
split.append(BOUNDARY);
split.append("\r\n");
split.append("Content-Disposition: form-data;name=\"" + file.getParameterName() + "\";filename=\"" + file.getFilname() + "\"\r\n");
split.append("Content-Type: " + file.getContentType() + "\r\n\r\n");
dos.write(split.toString().getBytes());
if (file.getInStream() != null) {
byte[] buffer = new byte[1024];
int len = -1;
int count = 0;
while ((len = file.getInStream().read(buffer)) != -1) {
dos.write(buffer, 0, len);
count += len;
if (mListener != null) {
mListener.onProgressChange(file.getFileSize(), count);
}
}
count = 0;
file.getInStream().close();
} else {
dos.write(file.getData(), 0, file.getData().length);
}
dos.write("\r\n".getBytes());
}
}
dos.writeBytes("--" + BOUNDARY + "--\r\n");
dos.flush();
} catch (IOException e) {
mListener.onError(new VolleyError(e.toString()));
try {
dos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliverResponse(String response) {
mListener.onSuccess(response);
}
@Override
public void deliverError(VolleyError error) {
mListener.onError(error);
}
}
Attached is demo connection: Android realizes file upload function