Volley 自定义上传图片提交数据

来源:互联网 发布:新疆的网络管制 编辑:程序博客网 时间:2024/05/22 10:28

Volley 谷歌开源网络访问框架,这个就不需要介绍了吧。
Volley 是可以自定义定制的,比如返回接口等等
平常的用到的数据访问,提交数据不涉及到上传的都很好用直接简单的自定义一下就可以用了
比如常用的如下

导入 compile 'com.mcxiaoke.volley:library:1.0.+'

最简单的自定义

/** * Created by Shall on 2015-07-29. */public class StringPostRequest extends StringRequest {    private Map<String, String> params;    public StringPostRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {        super(method, url, listener, errorListener);    }    public StringPostRequest(String url, Response.Listener<String> listener,                             Response.ErrorListener errorListener) {        this(Method.POST, url, listener, errorListener);    }    @Override    protected Map<String, String> getParams() throws AuthFailureError {        return params;    }    public void setParams(Map<String, String> params) {        this.params = params;    }    @Override    protected Response<String> parseNetworkResponse(NetworkResponse response) {        String parsed;        try {            parsed = (new String(response.data, HttpHeaderParser.parseCharset(response.headers)));            return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));        } catch (UnsupportedEncodingException e) {            return Response.error(new ParseError(response));        }    }}

而上面的也就只能用来常用的接口数据 对于文件图片上传是需要进行改造

抓过包的都知道常用的网页提交方式表格提交用来当作上传文件等操作因此需要在Volley的getBody里面做文章
表格提交的格式

------WebKitFormBoundaryAUyRkQZZLvy2Aj6lContent-Disposition: form-data; name="Test"Test------WebKitFormBoundaryAUyRkQZZLvy2Aj6lContent-Disposition: form-data; name="Test"2015729171419------WebKitFormBoundaryAUyRkQZZLvy2Aj6lContent-Disposition: form-data; name="Test"Test------WebKitFormBoundaryAUyRkQZZLvy2Aj6lContent-Disposition: form-data; name="Test"Test------WebKitFormBoundaryAUyRkQZZLvy2Aj6lContent-Disposition: form-data; name="Test"xxxxxxxxxxxxxxx------WebKitFormBoundaryAUyRkQZZLvy2Aj6lContent-Disposition: form-data; name="head"; filename="enterprise_gray_picture_none.png"Content-Type: image/png------WebKitFormBoundaryAUyRkQZZLvy2Aj6l--

我们只需模拟上面的格式即可

因此要自定义

public byte[] getBody() 

自定义这样

//没有图片就不执行 if (mUpImageLists == null || mUpImageLists.size() == 0) {            return super.getBody();        }        //自定义图片上传        ByteArrayOutputStream bos = new ByteArrayOutputStream();        StringBuffer sb = new StringBuffer();        Set keySet = params.keySet();        //常用的参数数据格式        for (Object keyName : keySet) {            sb.append("--" + BOUNDARY);            sb.append("\r\n");            sb.append("Content-Disposition: form-data;");            System.out.println("键名:" + keyName);            sb.append(" name=\"");            sb.append(keyName);            sb.append("\"");            sb.append("\r\n");            sb.append("\r\n");            sb.append(params.get(keyName));            sb.append("\r\n");        }        //文件数据        Set filePath = mUpImageLists.keySet();        for (Object name : filePath) {             sb.append("--" + Line);            sb.append("\r\n");            sb.append("Content-Disposition: form-data;");            sb.append("\r\n");            sb.append("Content-Type: application/octet-stream");            sb.append("\r\n");            sb.append("Content-Disposition: form-data;");            sb.append(" name=\"");            sb.append(name);            sb.append("\"");            sb.append("; filename=\"");            sb.append(mUpImageLists.get(name));            sb.append("\"");            sb.append("\r\n");            sb.append("\r\n");            try {                bos.write(sb.toString().getBytes("utf-8"));                bos.write(toBytes(new FileInputStream(mUpImageLists.get(name))));                bos.write("\r\n".getBytes("utf-8"));            } catch (IOException e) {                e.printStackTrace();            }        }        //结尾        String endLine = "--" + BOUNDARY + "--" + "\r\n";        try {            bos.write(endLine.toString().getBytes("utf-8"));        } catch (IOException e) {            e.printStackTrace();        }        return bos.toByteArray();

这样就能自定义上传图片了

完整的

package upimage.com.volley.shall.volleyupimage;import android.util.Log;import com.android.volley.AuthFailureError;import com.android.volley.NetworkResponse;import com.android.volley.ParseError;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;import com.android.volley.toolbox.StringRequest;import org.json.JSONException;import org.json.JSONObject;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.util.Map;import java.util.Set;/** * Created by Shall on 2015-07-29. */public class StringPostRequest extends StringRequest {    private Map<String, String> params;    private String Line = "--------------test---";    private Map<String, File> mUpImageLists;    public StringPostRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {        super(method, url, listener, errorListener);    }    public StringPostRequest(String url, Response.Listener<String> listener,                             Response.ErrorListener errorListener) {        this(Method.POST, url, listener, errorListener);    }    @Override    protected Map<String, String> getParams() throws AuthFailureError {        return mUpImageLists != null ? super.getParams() : params;    }    public void setmUpImageLists(Map<String, File> mUpImageLists) {        this.mUpImageLists = mUpImageLists;    }    @Override    public byte[] getBody() throws AuthFailureError {        if (mUpImageLists == null || mUpImageLists.size() == 0) {            return super.getBody();        }        //自定义图片上传        ByteArrayOutputStream bos = new ByteArrayOutputStream();        StringBuffer sb = new StringBuffer();        Set keySet = params.keySet();        //常用的参数数据格式        for (Object keyName : keySet) {            sb.append("--" + Line);            sb.append("\r\n");            sb.append("Content-Disposition: form-data;");            System.out.println("键名:" + keyName);            sb.append(" name=\"");            sb.append(keyName);            sb.append("\"");            sb.append("\r\n");            sb.append("\r\n");            sb.append(params.get(keyName));            sb.append("\r\n");        }        //文件数据        Set filePath = mUpImageLists.keySet();        for (Object name : filePath) {            sb.append("--" + Line);            sb.append("\r\n");            sb.append("Content-Disposition: form-data;");            sb.append("\r\n");            sb.append("Content-Type: application/octet-stream");            sb.append("\r\n");            sb.append("Content-Disposition: form-data;");            sb.append(" name=\"");            sb.append(name);            sb.append("\"");            sb.append("; filename=\"");            sb.append(mUpImageLists.get(name));            sb.append("\"");            sb.append("\r\n");            sb.append("\r\n");            try {                bos.write(sb.toString().getBytes("utf-8"));                bos.write(toBytes(new FileInputStream(mUpImageLists.get(name))));                bos.write("\r\n".getBytes("utf-8"));            } catch (IOException e) {                e.printStackTrace();            }        }        //结尾        String endLine = "--" + Line + "--" + "\r\n";        try {            bos.write(endLine.toString().getBytes("utf-8"));        } catch (IOException e) {            e.printStackTrace();        }        return bos.toByteArray();    }    public void setParams(Map<String, String> params) {        this.params = params;    }    public byte[] toBytes(InputStream in) throws IOException {        ByteArrayOutputStream out = new ByteArrayOutputStream();        int ch;        while ((ch = in.read()) != -1) {            out.write(ch);        }        byte buffer[] = out.toByteArray();        out.close();        return buffer;    }    @Override    public String getBodyContentType() {        return mUpImageLists != null ? "multipart/form-data" + "; boundary=" + Line : super.getBodyContentType();    }    @Override    protected Response<String> parseNetworkResponse(NetworkResponse response) {        String parsed;        try {            parsed = (new String(response.data, HttpHeaderParser.parseCharset(response.headers)));            return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));        } catch (UnsupportedEncodingException e) {            return Response.error(new ParseError(response));        }    }}

你们还可以拿去做根据自己的项目在进行修改

0 0