实现多文件的上传,基于标准的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, 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() {
@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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# http
# 文件上传
# Android使用 Retrofit 2.X 上传多文件和多表单示例
# Android中Okhttp3实现上传多张图片同时传递参数
# Android Retrofit实现多图片/文件、图文上传功能
# Android 使用 okhttp3和retrofit2 进行单文件和
# 上传
# 多个
# 来实现
# 大家多多
# 本例
# 判断是否
# 目录中
# false
# setUseCaches
# setDoOutput
# true
# method
# setRequestProperty
# Connection
# POST
# setRequestMethod
# setDoInput
# actionUrl
# HttpURLConnection
相关文章:
建站10G流量真的够用吗?如何应对访问高峰?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
定制建站是什么?如何实现个性化需求?
北京网站制作公司哪家好一点,北京租房网站有哪些?
建站之星客服服务时间及联系方式如何?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
建站之星如何实现网站加密操作?
css网站制作参考文献有哪些,易聊怎么注册?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
建设网站制作价格,怎样建立自己的公司网站?
建站之星如何助力网站排名飙升?揭秘高效技巧
如何通过IIS搭建网站并配置访问权限?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
装修招标网站设计制作流程,装修招标流程?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
建站之星CMS五站合一模板配置与SEO优化指南
Java解压缩zip - 解压缩多个文件或文件夹实例
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建站之星各版本价格是多少?
如何快速建站并高效导出源代码?
Swift中swift中的switch 语句
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
网站制作难吗安全吗,做一个网站需要多久时间?
香港服务器租用费用高吗?如何避免常见误区?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
定制建站策划方案_专业建站与网站建设方案一站式指南
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
制作网页的网站有哪些,电脑上怎么做网页?
淘宝制作网站有哪些,淘宝网官网主页?
建站之星如何快速更换网站模板?
制作销售网站教学视频,销售网站有哪些?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
做企业网站制作流程,企业网站制作基本流程有哪些?
javascript基本数据类型及类型检测常用方法小结
成都响应式网站开发,dw怎么把手机适应页面变成网页?
建站之星安装步骤有哪些常见问题?
如何在IIS7上新建站点并设置安全权限?
如何通过WDCP绑定主域名及创建子域名站点?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
建站之星如何取消后台验证码生成?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何用PHP工具快速搭建高效网站?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
Python文件管理规范_工程实践说明【指导】
*请认真填写需求信息,我们会在24小时内与您取得联系。