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

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里面做文章
表格提交的格式

------WebKitFormBoundaryAUyRkQZZLvy2Aj6l
Content-Disposition: form-data; name="Test"

Test
------WebKitFormBoundaryAUyRkQZZLvy2Aj6l
Content-Disposition: form-data; name="Test"

2015729171419
------WebKitFormBoundaryAUyRkQZZLvy2Aj6l
Content-Disposition: form-data; name="Test"

Test
------WebKitFormBoundaryAUyRkQZZLvy2Aj6l
Content-Disposition: form-data; name="Test"

Test
------WebKitFormBoundaryAUyRkQZZLvy2Aj6l
Content-Disposition: form-data; name="Test"

xxxxxxxxxxxxxxx
------WebKitFormBoundaryAUyRkQZZLvy2Aj6l
Content-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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值