最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
基于标准http实现Android多文件上传的教程
时间:2017-02-04 编辑:简简单单 来源:一聚教程网
实现多文件的上传,基于标准的http来实现。
1.多文件上传MyUploader类的实现:
代码如下 | 复制代码 |
/** * * 同步上传多个文件 * 基于标准的http实现,需要在非UI线程中调用,以免阻塞UI。 * */ publicclassMyUploader { privatestaticfinalString TAG ="MyUploader";
// ////////////////////同步上传多个文件///////// /** * 同步上传File * * @param Url * @param fullFileName * : 全路径,ex. /sdcard/f/yh.jpg * @param fileName * : file name, ex. yh.jpg * @return 服务器的响应结果(字符串形式) */ publicString MyUploadMultiFileSync(String Url, List String reulstCode =""; String end ="\r\n"; String twoHyphens ="--"; String boundary ="--------boundary";
try{ URL url =newURL(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 =newStringBuffer(); // 设置DataOutputStream DataOutputStream dos =newDataOutputStream(con.getOutputStream());
for(inti =0; i < fileList.size(); i++) {
String filePath = fileList.get(i);
intendFileIndex = filePath.lastIndexOf("/"); String fileName = filePath.substring(endFileIndex +1); Log.i(TAG,"filename= "+ fileName); // set 头部 StringBuilder sb =newStringBuilder();
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 =newFileInputStream(filePath); // 设置每次写入1024bytes intbufferSize =1024; byte[] buffer =newbyte[bufferSize];
intlength = -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 =newStringBuilder();
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(); intch; StringBuffer b =newStringBuffer(); 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(); }
returnreulstCode; } } |
2. 调用方法:
由于MyUploader的MyUploadMultiFileSync本身是同步的函数请求,所以,这个函数需要在非UI线程中执行。本例采用Thread+Handler的方式来进行说明。
下面是activity的主要代码,功能是将cache目录中的的jpg文件上传到指定的服务器:
代码如下 | 复制代码 |
publicvoiduploadThreadTest() { newThread(newRunnable() { @Override publicvoidrun() {
try{ upload(); }catch(Exception e) { e.printStackTrace(); } }
}).start();
}
privatevoidupload() { String url ="https://httpbin.org/post"; List
if(fileList ==null) { myHandler.sendEmptyMessage(-1); }else{ MyUploader myUpload =newMyUploader(); //同步请求,直接返回结果,根据结果来判断是否成功。 String reulstCode = myUpload.MyUploadMultiFileSync(url, fileList,null); Log.i(TAG,"upload reulstCode: "+ reulstCode); myHandler.sendEmptyMessage(0);
} }
privateList List File catchPath = mContext.getCacheDir();
if(catchPath!=null&& catchPath.isDirectory()) {
File[] files = catchPath.listFiles(); if(files ==null|| files.length<1) { returnnull; } for(inti =0; i < files.length; i++) { if(files[i].isFile() && files[i].getAbsolutePath().endsWith(".jpg")) { fileList.add(files[i].getAbsolutePath()); }
} returnfileList;
} returnnull;
} ////////////handler///// privateHandler myHandler =newHandler() { @Override publicvoidhandleMessage(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
-
上一个: 微信亲密充怎么设置 微信亲密充有什么用
相关文章
- sora软件价格介绍 02-22
- sora官网入口地址一览 02-22
- Sora生成的视频使用教程 02-22
- 《梦幻西游》元宵灯谜线索答案大全2024 02-22
- 《原神》有朋自远方来第一天通关攻略 02-22
- 《苏醒之路》四个结局达成攻略 02-22