Welcome

首页 / 移动开发 / Android / 基于标准http实现Android多文件上传

实现多文件的上传,基于标准的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 = "
"; String twoHyphens = "--"; String boundary = "--------boundary"; try {URL url = new URL(actionUrl);HttpURLConnection con = (HttpURLConnection) url.openConnection();// 允许Input、Output,不使用Cachecon.setDoInput(true);con.setDoOutput(true);con.setUseCaches(false);// 设置传送的method=POSTcon.setRequestMethod("POST");// setRequestPropertycon.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();// 设置DataOutputStreamDataOutputStream 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, 0, 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() {@Overridepublic 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。