实现多文件的上传,基于标准的http来实现。
1.多文件上传MyUploader类的实现:
/** * * 同步上传多个文件 * 基于标准的http实现,需要在非UI线程中调用,以免阻塞UI。 * */public class MyUploader { private static final String TAG = "MyUploader"; // ////////////////////同步上传多个文件///////// /** * 同步上传file * * @param Url * @param fullfilename * : 全路径,ex. /sdcard/f/yh.jpg * @param filename * : file name,ex. yh.jpg * @return 服务器的响应结果(字符串形式) */ public String MyUploadMultifileSync(String Url,List<String> fileList,Map<String,String> params) { String reulstCode = ""; String end = "\r\n"; String twoHyphens = "--"; String boundary = "--------boundary"; try { URL url = new URL(actionUrl); httpURLConnection con = (httpURLConnection) url.openConnection(); // 允许input、Output,不使用Cache con.setDoinput(true); con.setDoOutput(true); con.setUseCaches(false); // 设置传送的method=POST con.setRequestMethod("POST"); // setRequestProperty con.setRequestProperty("Connection","Keep-Alive"); con.setRequestProperty("Charset","UTF-8"); // con.setRequestProperty("Content-Type",// "application/x-www-form-urlencoded"); con.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary); StringBuffer s = new StringBuffer(); // 设置DataOutputStream DataOutputStream dos = new DataOutputStream(con.getoutputStream()); for (int i = 0; i < fileList.size(); i++) { String filePath = fileList.get(i); int endfileIndex = filePath.lastIndexOf("/"); String filename = filePath.substring(endfileIndex + 1); Log.i(TAG,"filename= " + filename); // set 头部 StringBuilder sb = new StringBuilder(); sb.append(twoHyphens); sb.append(boundary); sb.append(end); sb.append("Content-disposition: form-data; "); sb.append("name=" + "\"" + "upload_file" +i + "\""); sb.append(";filename="); sb.append("\"" + filename + "\""); sb.append(end); sb.append("Content-Type: "); sb.append("image/jpeg"); sb.append(end); sb.append(end); // 1. write sb dos.writeBytes(sb.toString()); // 取得文件的fileinputStream fileinputStream fis = new fileinputStream(filePath); // 设置每次写入1024bytes int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length = -1; // 从文件读取数据至缓冲区 while ((length = fis.read(buffer)) != -1) { dos.write(buffer,length); } dos.writeBytes(end); fis.close(); dos.writeBytes(end); dos.writeBytes(end); //dos.writeBytes(end); //dos.flush(); // close streams //fis.close(); } // set 尾部 StringBuilder sb2 = new StringBuilder(); if (params != null && !params.isEmpty()) { for (String key : params.keySet()) { String value = params.get(key); sb2.append(twoHyphens); sb2.append(boundary); sb2.append(end); sb2.append("Content-disposition: form-data; "); sb2.append("name=" + "\""); sb2.append(key + "\""); sb2.append(end); sb2.append(end); sb2.append(value); sb2.append(end); } } sb2.append(twoHyphens + boundary + end); dos.writeBytes(sb2.toString()); dos.flush(); Log.i(TAG,"sb2:" + sb2.toString()); // 取得Response内容 inputStream is = con.getinputStream(); int ch; StringBuffer b = new StringBuffer(); while ((ch = is.read()) != -1) { b.append((char) ch); } reulstCode = b.toString().trim(); // 关闭 dos.close(); } catch (IOException e) { Log.i(TAG,"IOException: " + e); e.printstacktrace(); } return reulstCode; }}
2. 调用方法:
由于MyUploader的MyUploadMultifileSync本身是同步的函数请求,所以,这个函数需要在非UI线程中执行。本例采用Thread+Handler的方式来进行说明。
下面是activity的主要代码,功能是将cache目录中的的jpg文件上传到指定的服务器:
public voID uploadThreadtest() { new Thread(new Runnable() { @OverrIDe public voID run() { try { upload(); } catch (Exception e) { e.printstacktrace(); } } }).start(); } private voID upload() { String url = "https://httpbin.org/post"; List<String> fileList = getCachefiles(); if (fileList == null) { myHandler.sendEmptyMessage(-1); }else { MyUploader myUpload = new MyUploader(); //同步请求,直接返回结果,根据结果来判断是否成功。 String reulstCode = myUpload.MyUploadMultifileSync(url,fileList,null); Log.i(TAG,"upload reulstCode: " + reulstCode); myHandler.sendEmptyMessage(0); } } private List<String> getCachefiles() { List<String> fileList = new ArrayList<String>(); file catchPath = mContext.getCacheDir(); if (catchPath!=null && catchPath.isDirectory()) { file[] files = catchPath.Listfiles(); if (files == null || files.length<1) { return null; } for (int i = 0; i < files.length; i++) { if (files[i].isfile() && files[i].getabsolutePath().endsWith(".jpg")) { fileList.add(files[i].getabsolutePath()); } } return fileList; } return null; } ////////////handler///// private Handler myHandler = new Handler() { @OverrIDe public voID handleMessage(Message msg) { Log.i(TAG,"handleMessage msg===" + msg); if (msg.what == -1) { Toast.makeText(mContext,"not find file!",Toast.LENGTH_LONG).show(); return; }else { Toast.makeText(mContext,"upload success!",Toast.LENGTH_LONG).show(); } } };
3 项目demo代码地址:https://github.com/ranke/HttpAsyncTest
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的基于标准http实现Android多文件上传全部内容,希望文章能够帮你解决基于标准http实现Android多文件上传所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)