Volley扩展-支持表单上传(文本或文件)

来源:互联网 发布:电气制图cad软件 编辑:程序博客网 时间:2024/05/21 07:46
</pre><pre code_snippet_id="1586756" snippet_file_name="blog_20160224_2_4887381" name="code" class="java"><span style="font-size:18px;">对返回的json字符串根据对象或数组标记进行Gson解析;</span>
package com.android.volley.toolbox;import com.android.volley.AuthFailureError;import com.android.volley.DefaultRetryPolicy;import com.android.volley.NetworkResponse;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.Request.ResponseListener;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.FileProgressListener;import com.android.volley.toolbox.FormFile;import com.android.volley.toolbox.HttpHeaderParser;import java.io.DataOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;public class MultipartRequest extends Request<String> {    private final ResponseListener mListener;//服务器响应的数据回调    private final FileProgressListener mProgressListener;文件上传进度回调    private Map<String, String> headerMap;    private Map<String, String> mParams;//上传的参数    private FormFile[] files;//上传的文件参数    private String BOUNDARY;    private boolean object;//返回的具体数据是否为对象    private Class mClass;//对象字节码类型    public MultipartRequest(String url, ResponseListener listener, ErrorListener errorListener, Map<String, String> params, FormFile[] files, Class clazz, boolean object) {        this(1, url, listener, errorListener, (FileProgressListener)null, params, files, clazz, object);    }    public MultipartRequest(String url, ResponseListener listener, ErrorListener errorListener, FileProgressListener progressListener, Map<String, String> params, FormFile[] files, Class clazz, boolean object) {        this(1, url, listener, errorListener, progressListener, params, files, clazz, object);    }    public MultipartRequest(int method, String url, ResponseListener listener, ErrorListener errorListener, FileProgressListener progressListener, Map<String, String> params, FormFile[] files, Class clazz, boolean object) {        super(method, url, errorListener);        this.BOUNDARY = "---------7dc05dba8f3e19";        this.mListener = listener;        this.mProgressListener = progressListener;        this.mParams = params;        this.files = files;        this.mClass = clazz;        this.object = object;        this.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0F));    }    public String getBodyContentType() {        return "multipart/form-data; boundary=" + this.BOUNDARY;    }    public byte[] getBody() throws AuthFailureError {        if(this.getParams() != null) {            return super.getBody();        } else {            StringBuilder sb = new StringBuilder();            Iterator var3 = this.mParams.entrySet().iterator();            while(var3.hasNext()) {                Entry e = (Entry)var3.next();                sb.append("--");                sb.append(this.BOUNDARY);                sb.append("\r\n");                sb.append("Content-Disposition: form-data; name=\"" + (String)e.getKey() + "\"\r\n\r\n");                sb.append((String)e.getValue());                sb.append("\r\n");            }            try {                return sb.toString().getBytes("utf-8");            } catch (UnsupportedEncodingException var4) {                var4.printStackTrace();                return null;            }        }    }    public void writeFile(OutputStream out) {        DataOutputStream dos = (DataOutputStream)out;        try {            if(this.files != null) {                FormFile[] var6 = this.files;                int var5 = this.files.length;                for(int e1 = 0; e1 < var5; ++e1) {                    FormFile e = var6[e1];                    StringBuilder split = new StringBuilder();                    split.append("--");                    split.append(this.BOUNDARY);                    split.append("\r\n");                    split.append("Content-Disposition: form-data;name=\"" + e.getParameterName() + "\";filename=\"" + e.getFileName() + "\"\r\n");                    split.append("Content-Type: " + e.getContentType() + "\r\n\r\n");                    dos.write(split.toString().getBytes());                    if(e.getInputStream() == null) {                        dos.write(e.getBytes(), 0, e.getBytes().length);                    } else {                        byte[] buffer = new byte[1024];                        boolean len = true;                        int count = 0;                        int var13;                        while((var13 = e.getInputStream().read(buffer)) != -1) {                            dos.write(buffer, 0, var13);                            count += var13;                            if(this.mProgressListener != null) {                                this.mProgressListener.onProgressChange(e.getFileSize(), count);                            }                        }                        boolean var14 = false;                        e.getInputStream().close();                    }                    dos.write("\r\n".getBytes());                }            }            dos.write(("--" + this.BOUNDARY + "--\r\n").getBytes("utf-8"));            dos.flush();        } catch (Exception var12) {            this.deliverError(new VolleyError(var12.toString()));            try {                dos.close();            } catch (IOException var11) {                var11.printStackTrace();            }        }    }    protected Response<String> parseNetworkResponse(NetworkResponse response) {        String parsed;        try {            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));        } catch (UnsupportedEncodingException var4) {            parsed = new String(response.data);        }        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));    }    protected void deliverResponse(String response) {        this.mListener.onResponse(response, this.mClass, this.object);    }}

0 0
原创粉丝点击