Android volley 解析(三)之文件上传篇

前面我们讲了如何通过 volley 实现表单的提交,而这篇文章跟上一篇衔接很大,如果没有看上一篇 blog 的朋友,建议先去看看 Android Volley解析(二)之表单提交篇 因为文件上传实质就是表单的提交,只不过它提交的数据包含文件类型,接下来还是按照表单提交的套路来分析。

数据格式

这里我们通过图片上传的案例来分析,其他文件也是同样的实现方式;以下是我在传图网传图时,上传的数据格式,先来分析一下

: : : : : : –Type: image/pngJFIFC%# , #&’)*)-0-(0%()(C(((((((((((((((((((((((((((((((((((((((((((((((((((“}!1AQa”q2#BR$3br%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq”2B #3Rbr$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?PNG——WebKitFormBoundaryS4nmHw9nb2Eeusll–

不难发现,这种格式跟表单提交的格式非常接近,不过还是有所差别,这里仔细看还是能看出来总共有加上结尾行,有五行,因为乱码部分,其实就是图片的二进制数,整个算一行;下面来分析下: 1、第一行:”–” + boundary + “\r\n” ; 前面也说了文件上传,其实就是表单提交,,所以在提交数据的开始标志不变; 2、第二行:Content-Disposition: form-data;; filename=”上传的文件名” + “\r\n” 这里比普通的表单多了一个filename=”上传的文件名”; 3、第三行:Content-Type: 文件的 mime 类型 + “\r\n” 这一行是文件上传必须要的,而普通的文字提交可有可无,mime 类型需要根据文档查询; 4、第四行:”\r\n” 5、第五行文件的二进制数据 + “\r\n”: 这里跟普通表单提交一样; 结尾行:”–” + boundary + “–” + “\r\n” 可以看到,文件上传的诗句格式跟我们上一篇博文中讲到的表单提交只有两个地方不同,1、第二行的时候增加了一个文件名变量,2、增加了一行Content-Type: 文件的 mime 类型 + “\r\n”; 文件也可以同时上传多个文件,上传多个文件的时候重复1、2、3、4、5步,在最后的一个文件的末尾加上统一的结束行。

文件实体类

这里是对图片操作所以我建了一个FormImg.java

/** * Created by moon.zhong on 2015/3/3. */{//参数的名称private String mName ;//文件名private String mFileName ;//文件的 mime,需要根据文档查询private String mMime ;//需要上传的图片资源,因为这里测试为了方便起见,直接把 bigmap 传进来,真正在项目中一般不会这般做,而是把图片的路径传过来,在这里对图片进行二进制转换private Bitmap mBitmap ;public FormImage(Bitmap mBitmap) {this.mBitmap = mBitmap;}public String getName() {;}public String getFileName() {;}[] getValue() {ByteArrayOutputStream bos = new ByteArrayOutputStream() ;mBitmap.compress(Bitmap.CompressFormat.JPEG,80,bos) ;return bos.toByteArray();}//因为我知道是 png 文件,所以直接根据文档查的public String getMime() {return “image/png”;}}Volley 对文件数据的封装/** * Created by gyzhong on 15/3/1. */public <String> {/*** 正确数据的时候回掉用*/private ResponseListener mListener ;/*请求 数据通过参数的形式传入*/private List<FormImage> mListItem ;private String BOUNDARY = “————–520-13-14”; //数据分隔线private String MULTIPART_FORM_DATA = “multipart/form-data”;public PostUploadRequest(String url, List<FormImage> listItem, ResponseListener listener) {super(Method.POST, url, listener);this.mListener = listener ;setShouldCache(false);mListItem = listItem ;//设置请求的响应事件,因为文件上传需要较长的时间,所以在这里加大了,设为5秒setRetryPolicy(new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));}/*** 这里开始解析数据* @param response Response from the network* @return*/@Overrideprotected Response<String> parseNetworkResponse(NetworkResponse response) {try {String mString =new String(response.data, HttpHeaderParser.parseCharset(response.headers));Log.v(“zgy”, “====mString===” + mString);return Response.success(mString,HttpHeaderParser.parseCacheHeaders(response));} catch (UnsupportedEncodingException e) {return Response.error(new ParseError(e));}}/*** 回调正确的数据* @param response The parsed response returned by*/@Overrideprotected void deliverResponse(String response) {mListener.onResponse(response);}@Overridepublic byte[] getBody() throws AuthFailureError {if (mListItem == null||mListItem.size() == 0){return super.getBody() ;}ByteArrayOutputStream bos = new ByteArrayOutputStream() ;int N = mListItem.size() ;FormImage formImage ;for (int i = 0; i < N ;i++){formImage = mListItem.get(i) ;StringBuffer sb= new StringBuffer() ;/*第一行*///`”–” + BOUNDARY + “\r\n”`sb.append(“–“+BOUNDARY);sb.append(“\r\n”) ;/*第二行*///Content-Disposition: form-data;; filename=”上传的文件名” + “\r\n”sb.append(“Content-Disposition: form-data;”);sb.append(” name=\””);sb.append(formImage.getName()) ;sb.append(“\””) ;sb.append(“; filename=\””) ;sb.append(formImage.getFileName()) ;sb.append(“\””);sb.append(“\r\n”) ;/*第三行*///Content-Type: 文件的 mime 类型 + “\r\n”sb.append(“Content-Type: “);sb.append(formImage.getMime()) ;sb.append(“\r\n”) ;/*第四行*///”\r\n”sb.append(“\r\n”) ;try {bos.write(sb.toString().getBytes(“utf-8”));/*第五行*///文件的二进制数据 + “\r\n”bos.write(formImage.getValue());bos.write(“\r\n”.getBytes(“utf-8″));} catch (IOException e) {e.printStackTrace();}}/*结尾行*///`”–” + BOUNDARY + “–” + “\r\n”`String endLine = “–” + BOUNDARY + “–” + “\r\n” ;try {bos.write(endLine.toString().getBytes(“utf-8”));} catch (IOException e) {e.printStackTrace();}Log.v(“zgy”,”=====formImage====\n”+bos.toString()) ;return bos.toByteArray();}//Content-Type: multipart/form-data; boundary=———-8888888888888@Overridepublic String getBodyContentType() {return MULTIPART_FORM_DATA+”; boundary=”+BOUNDARY;}}若不给自己设限,则人生中就没有限制你发挥的藩篱。

Android volley 解析(三)之文件上传篇

相关文章:

你感兴趣的文章:

标签云: