基于标准http实现Android多文件上传
作者:m45y 发布时间:2023-05-28 05:55:28
标签:Android,http,文件上传
实现多文件的上传,基于标准的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


猜你喜欢
- 1,带Tomcat的打包方式1.1, 在pom.xml文件添加以下配置(目的:自定main入口和跳过Junit代码)<build>
- 1.通过看logcat下的日志2.通过adb命令3.通过写代码获取3.1写一个工具类打印系统时间3.2 在Application启动的时候打
- 之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法:(1
- java 可变参数详解 可变参数(Varargs)使程序员可以声明一个接受可变数目参数的方法。可变参数也
- 本文实例为大家分享了java实现点击按钮事件弹出子窗口的具体代码,供大家参考,具体内容如下要求:1、在父窗口中添加一个按钮2、点击按钮弹出子
- 废话不多说了,下面代码给大家介绍下利用正则表达式判断字符的方法,具体代码如下所示:using System;using System.Tex
- aes 对称加密密钥必须是32字节using System;using System.Security.Cryptography;using
- 1、使用排序2、原理事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collections.so
- 应朋友们反馈的Android基础薄弱的问题,决定出一套Android基础教程,帮助大家复习,巩固Android基础,今天要讲的是Androi
- 这两种方式也是大家在日常编码工作当中用的比较多的判断方式、之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别今天就和大家一起深入
- 这篇文章主要介绍了Springboot分页插件使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁。S
- 在页面显示的时候,有时候文字无法显示完全,就只能显示部分文字,但是直接截取就只能截取等长字符串,英文和中文很难处理所以就写了下面方法,截取等
- 今天给大家介绍一下如何实现一款简约时尚的安卓登陆界面。大家先看一下效果图当用户输入时动态出现删除按钮 现在先罗列一下技术点:1.如何使用圆角
- 1、MyBatis调用存储过程MyBatis支持使用存储过程的配置。当使用存储过程时,需要设置一个参数“mode”,其值有IN(输入参数)、
- 题目一 解法/** * Definition for a binary tree node. * public class Tre
- 本文实例讲述了Java常用HASH算法。分享给大家供大家参考,具体如下:/*** Hash算法大全<br>* 推荐使用FNV1算
- 一、题目描述题目实现:在进行网络编程时,由于进行网络连接是比较消耗资源的,因此,可以对连接的等待时间进行设置,如果在规定的时间没有进行连接,
- <?xml version="1.0" encoding="utf-8"?><Ed
- 本文实例为大家分享了Unity实现俄罗斯方块第2部分,供大家参考,具体内容如下代码部分1. 实现物体自由降落(在有关于物体的脚本中编写)1)