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
- Volley 自定义上传图片提交数据
- Volley上传图片
- Volley实现图片上传
- Volley 上传图片
- Volley 上传图片
- Volley图片上传
- Volley上传图片
- android Volley 上传文件上传图片
- android Volley 上传文件上传图片
- 使用FormData表单数据对象提交表单及上传图片
- Volley框架(三):使用Volley提交表单数据
- 使用Volley提交Json数据post
- springMVC上传图片+ajaxufilepload.js异步提交数据+选择完毕直接执行上传操作
- 通过自定义数据绑定类实现MVC中图片上传
- 单张图片上传表单提交
- 图片上传并异步提交
- 表单提交之上传图片
- 异步上传图片-ajaxSubmit提交
- UITouch 触摸事件处理(实例)
- 欢迎使用CSDN-markdown编辑器
- Java Timer 定时器的使用
- MySQL Study之--MySQL优化分析工具explain
- iOS开发多线程篇—NSOperation基本操作
- Volley 自定义上传图片提交数据
- SQL中distinct
- Oracle 查看收集统计信息
- 杭电 1232 畅通工程 并查集
- n后问题
- JAVA自学路线图
- A Pattern is a solution to a problem in a context
- spring+springmvc+hibernate完整示例
- mac homebrew的安装、使用、FAQ