最近项目中用到了断点续传的功能 把代码贴在这儿有需要的可以自取
public class FileBiz { int legth = 0; InputStream in = null; RandomAccessFile randomAccessFile ; int chunks=1;//这是切片的数量默认为1 String fileType;//后缀 String code ;//这是随机码 int pos=0;//这是标示现在上传到哪个位置的标识符 //code 是随机码 YiErMerEvent.HttpEvent message =null; /** * 申请上传一个文件 * api会自动检测是否以前上传过该文件(以文件的md5作为标识,和文件名等无关) * @method POST * param md5 * param size int 文件大小 * param chunks int 切片的总数量 * param suffix string 文件后缀 * param type int 1普通图片2证件图片 * @url upload-apply * @return string * @status 200|401|500 * @format * [ * 'id'=>string(随机标识码,每次上传文件切片需要携带,服务器以该标识码辨识是哪个文件的切片) * 'uploaded'=>0|1 int 文件是否在服务器存在 0 不存在需要上传 1 已经存在不需要上传 * 'path'=>string 如果uploaded是1 该变量存储了图片路径 如果uploaded是0 该变量为空 * */ public void upLoadApply(final int type, final String path, final YiErMerEvent.HttpEvent httpEvent) { final File file; if(httpEvent!=null){ message=httpEvent; } final byte[] tempbyte = new byte[1024*512]; file = new File(path); StringRequest request = new StringRequest(Request.Method.POST, Url.UPLODEAPPLY, new Response.Listener<String>() { @Override public void onResponse(String s) { try { JSONObject jsonObject =new JSONObject(s.toString()); if(jsonObject.getInt("status")==200){ JSONObject jsonObject1=new JSONObject(jsonObject.getString("result").toString()); code=jsonObject1.getString("code"); //文件大小小于1MB不需要切片上传的情况 if(chunks==1){ } new Thread() { @Override public void run() { super.run(); Looper.prepare(); try { uploadThread(); } catch (IOException e) { e.printStackTrace(); } Looper.loop(); } private void uploadThread() throws IOException { int elseLenth=legth-(pos*1024*512); System.out.println("ceshi----pos------ "+pos); randomAccessFile = new RandomAccessFile(path, "rw"); randomAccessFile.seek(pos*1024*512);//将文件流的位置移动到pos字节处 //用于保存实际读取的字节数 AjaxParams params = new AjaxParams(); final ByteArrayInputStream stream ; if(elseLenth<1024*512){ byte[] tempbyteforelse=new byte[elseLenth]; randomAccessFile.read(tempbyteforelse); System.out.println("ceshi----tempbyteforelselenth------ "+tempbyteforelse.length); System.out.println("ceshi----tempbyteforelselenth------ "+ Arrays.toString(tempbyteforelse)); stream = new ByteArrayInputStream(tempbyteforelse); params.put("file", stream,String.valueOf(pos+1),"video/mp4"); // 提交字节流 }else{ randomAccessFile.read(tempbyte); System.out.println("ceshi----tempbytelenth------ "+tempbyte.length); System.out.println("ceshi----tempbyteforelselenth------ "+ Arrays.toString(tempbyte)); stream = new ByteArrayInputStream(tempbyte); params.put("file", stream,String.valueOf(pos+1),"video/mp4");// 提交字节流 } FinalHttp fh = new FinalHttp(); fh.addHeader("token" , ShopApp.token); fh.post(Url.UPLODEFILE+code, params, new AjaxCallBack<String>() { @Override public void onLoading(long count, long current) { } @Override public void onSuccess(String o) { super.onSuccess(o); try { stream.close(); } catch (IOException e) { e.printStackTrace(); } try { JSONObject jsonObject = new JSONObject(o); if (pos >= chunks) { //传入数据 一次传完 UplodeFinish(code); in.close(); sessionId = ""; } else { pos++; uploadThread(); } } catch (Exception e) { e.printStackTrace(); } } }); } }.start(); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println(volleyError); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> header = new HashMap<>(); header.put("token", ShopApp.token); return header; } @Override protected Map<String, String> getParams() throws AuthFailureError { String fileName=file.getName(); String[] suffixs = fileName.split("\\."); fileType = suffixs[1]; Map<String, String> params = new HashMap<>(); params.put("md5", MD5.getFileMD5(file)); params.put("suffix", fileType); params.put("type", String.valueOf(type)); chunks=((int)FileSizeUtil.getFileSize(file)/(1024*512)); legth=(int)FileSizeUtil.getFileSize(file); params.put("chunks", String.valueOf(chunks+1)); System.out.println("ceshi----chunks------ "+chunks); params.put("size", String.valueOf((int)FileSizeUtil.getFileSize(file))); return params; } }; mQueue.add(request); } /** * 上传完成后调用服务器接口完成上传 * type用处(register|login|resetpwd) */ public void UplodeFinish(final String code) { iStringRequest request = new iStringRequest(Request.Method.PUT, Url.UPLODEFHINIS+code, new Response.Listener<String>() { @Override public void onResponse(String response) { message.what = 1; try { JSONObject jsonObject =new JSONObject(response.toString()); System.out.println("ceshi----finish------ "+jsonObject.get("status")); } catch (JSONException e) { e.printStackTrace(); } EventBus.getDefault().post(message); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { message.what = -1; message.errorCode = volleyError.networkResponse.statusCode; EventBus.getDefault().post(message); } }){ }.addHeaders("token", ShopApp.token); mQueue.add(request); } }