AsyncHttpClient开源框架android-async-http还是非常方便的。 AsyncHttpClient该类通经常使用在android应用程序中创建异步GET,

POST, PUT和DELETE HTTP请求。请求參数通过RequestParams实例创建。响应通过重写匿名内部类 ResponseHandlerInterface的

方法处理。

1、看代码上传文件

	public void uploadFile(ArrayList<String> sendFilesPath) {
if (sendFilesPath.size() == 0)
return ; String strUploadFile = mstrIP + mstrUploadFile;
AsyncHttpClient client = new AsyncHttpClient();
client.setURLEncodingEnabled(false); RequestParams params = new RequestParams();
params.put("user_name", mstrUser);
params.put("token", mstrCheckPass);
params.put("dir_parent", "@sys");
//批量上传
for (int i = 0; i < sendFilesPath.size(); i++) {
File myFile = new File(sendFilesPath.get(i));
try {
params.put(myFile.getName(), myFile);
} catch (FileNotFoundException e1) {
continue;
}
} client.setTimeout(10000);
client.post(strUploadFile, params, new AsyncHttpResponseHandler() { @Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable arg3) {
Log.i("Show", "upload failed");
} @Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
String responseData = new String();
responseData = new String(responseBody);
try {
JSONObject jsonObject = new JSONObject(responseData);
int status = jsonObject.getInt("status");
if (status == 1) {
Log.i("Show", "upload 1");
}
} catch (Exception e) {
}
} @Override
public void onProgress(int bytesWritten, int totalSize) {
super.onProgress(bytesWritten, totalSize);
int count = (int) ((bytesWritten * 1.0 / totalSize) * 100);
// 上传进度显示
progress.setProgress(count);
Log.e("上传 Progress>>>>>", bytesWritten + " / " + totalSize);
} @Override
public void onRetry(int retryNo) {
super.onRetry(retryNo);
// 返回重试次数
}
});
}

2、删除server文件代码

	public void deleteFile(final ArrayList<String> needDeleteFilesPath) {
if (needDeleteFilesPath.size() == 0)
return;
String strDeleteFile = mstrIP + mstrDeleteFiles;
AsyncHttpClient client = new AsyncHttpClient();
client.setURLEncodingEnabled(false);
RequestParams params = new RequestParams();
params.put("user_name", mstrUser);
params.put("token", mstrCheckPass);
params.put("dir_parent", "@sys");
// 批量
for (int i = 0; i < needDeleteFilesPath.size(); i++) {
params.put("files_id", needDeleteFilesPath.get(i));
client.setTimeout(10000);
client.post(strDeleteFile, params, new AsyncHttpResponseHandler() { @Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable arg3) {
Log.i("Show", "delete faile");
} @Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
String responseData = new String(responseBody);
}
});
}
}

3、使用使用HttpURLConnection断点续传下载文件

AsyncTask<String, Integer, Boolean>异步管理下载文件,使用HttpURLConnection断点续传。

		TaskDownFile mDownFile = new TaskDownFile();
mDownFile.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, url_downFile,fileName, String.valueOf(nDownID));
	public class TaskDownFile extends AsyncTask<String, Integer, Boolean> {
@Override
protected void onPreExecute() {
} @Override
protected Boolean doInBackground(String... arg0) {
String mFilePath;
String urlString = arg0[0];
String fileName = arg0[1];
int nDownID = Integer.parseInt(arg0[2]);
HttpURLConnection conn;
if (mFileInfos == null || mFileInfos.size() <= 0)
return false; try {
File file = new File(mstrFilePath);
if (!file.exists())
file.mkdir();
mFilePath = mstrFilePath + "/" + fileName; // 推断当前安装包路径以下是否有已经下载的文件, 如有则不下载,仅仅须要MD5校验就可以
String checkApkFilePath = mstrFilePath + "/" + fileName;
File checkApkFile = new File(checkApkFilePath); if (checkApkFile.exists()) {
// MD5校验
String md5 = md5sum(mFilePath);
String fileTime = getFileDataTime(checkApkFile);
// MD5校验是否文件同样。在依据时间推断
if (md5.compareToIgnoreCase(mFileInfos.get(nDownID).md5) == 0)
return true;
else if (compareDataTime(fileTime,
mFileInfos.get(nDownID).create_time) > 0) {
mNumberList.add(nDownID);
return true;
} else {
// server文件最新。 删除本地文件
checkApkFile.delete();
}
} // 暂时安装文件检验, 是否续传文件
mFilePath = mFilePath + ".temp";
long haveDownLength = 0;
File tempFile = new File(mFilePath);
if (tempFile.exists())
haveDownLength = tempFile.length(); conn = (HttpURLConnection) new URL(urlString).openConnection();
if (haveDownLength != 0)
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setReadTimeout(6000);
conn.setConnectTimeout(3000);
conn.setChunkedStreamingMode(0);
conn.setRequestMethod("GET"); conn.connect(); int fileSize = conn.getContentLength();
long countRead = haveDownLength;
if (fileSize > 0) {
InputStream stream = conn.getInputStream();
FileOutputStream fos = new FileOutputStream(mFilePath,
haveDownLength > 0 ? true : false);
int read = 0; fileSize += haveDownLength;
byte buffer[] = new byte[1024];
while ((read = stream.read(buffer)) >= 0) {
countRead += read;
fos.write(buffer, 0, (int) read);
publishProgress((int) countRead, fileSize);
}
fos.flush();
stream.close();
fos.close();
} else {
fileSize = (int) haveDownLength;
}
conn.disconnect(); if (countRead != fileSize)
return false; int index = mFilePath.indexOf(".temp");
if (index >= 1) {
String tempFilePath = mFilePath.substring(0, index);
File renameFile = new File(mFilePath);
File toFile = new File(tempFilePath);
renameFile.renameTo(toFile);
mFilePath = tempFilePath;
return true;
}
} catch (IOException e) {
Log.i("Show", e.toString());
return false;
} finally {
}
return false;
} @Override
protected void onPostExecute(Boolean isSuccess) {
//下载后干什么
} @Override
protected void onProgressUpdate(Integer...values) {
//进度条
if (values[0] == null) return;
downSize = values[0];
fileSize = values[1];
progress = (int) ((values[0] * 1.0 / values[1]) * 10000);
mHandler.sendEmptyMessage(DOWNLOAD);
}
}

4、MD5检验文件

	//文件md5获取
public static String md5sum(String filename) {
InputStream fis;
byte[] buffer = new byte[1024];
int numRead = 0;
MessageDigest md5;
try {
fis = new FileInputStream(filename);
md5 = MessageDigest.getInstance("MD5");
while ((numRead = fis.read(buffer)) > 0) {
md5.update(buffer, 0, numRead);
}
fis.close();
return toHexString(md5.digest());
} catch (Exception e) {
System.out.println("error");
return null;
}
} //十六进制转换成字符串
public static String toHexString(byte[] b) {
char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
StringBuilder sb = new StringBuilder(b.length * 2);
for (int i = 0; i < b.length; i++) {
sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
sb.append(HEX_DIGITS[b[i] & 0x0f]);
}
return sb.toString();
}

使用AsyncHttpClient也是能够上传、下载、删除的。

仅仅只是下载不是非常好用。

下载推荐使用HttpURLConnection。由于文件大的话,能够暂停下载。或者下载时候断了。能够又一次接着下载。

MD5在文件下载检验也是非常重要,看文件有没有丢失或者缺损。

下一章准备总结一下缓存txt数据。文件最后改动时间的比較。两个string数据的比較。

android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件的更多相关文章

  1. Android使用XUtils框架上传照片(一张或多张)和文本,server接收照片和文字(无乱码)

    Android上传图片,这里我使用了如今比較流行的XUtils框架.该框架能够实现文件上传.文件下载.图片缓存等等,有待研究. 以下是Android端上传的代码: xUtils.jar下载 Strin ...

  2. jQuery用FormData对象实现文件上传以及如何通过ajax下载文件

    之前在Vue的项目里面用到过文件上传,封装好的组件用起来比较顺手,查询Element-UI文档,十八般武器样样都有,一顿操作猛如虎,一看--跑偏了(⊙o⊙)-,我的意思就是用框架实现比较简单,但是如果 ...

  3. win端git连接私服仓库+上传本地项目+从服务器下载文件到win

    win端git连接私服仓库: 1.win端 检查c:/Users/用户/.ssh/目录下是否有config文件(!!!没有任何后缀名).如果没有则新建config文件,然后修改添加如下内容: Host ...

  4. Android连接socket服务器上传下载多个文件

    android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { ;// 端口号,必须与客户端一致 ...

  5. Android+Spring Boot 选择+上传+下载文件

    2021.02.03更新 1 概述 前端Android,上传与下载文件,使用OkHttp处理请求,后端使用Spring Boot,处理Android发送来的上传与下载请求.这个其实不难,就是特别多奇奇 ...

  6. android+nutz后台如何上传和下载图片

    android+nutz后台如何上传和下载图片  发布于 588天前  作者 yummy222  428 次浏览  复制  上一个帖子  下一个帖子  标签: 无 最近在做一个基于android的ap ...

  7. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  8. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  9. web操作文件的上传到服务器 并可下载 并且读取出来

    1.文件的上传-servlet实现文件上传---核心API—DiskFileItemFactory 一.文件上传概述 l  实现web开发中的文件上传功能,需完成如下二步操作: •    在web页面 ...

随机推荐

  1. 原型设计工具 Axure

    ahjesus Axure RP 7.0注册码 ahjesus Axure RP 7.0注册码 用户名:axureuser 序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9I ...

  2. JSONP跨域访问百度实现搜索提示小案例

    一.JSONP简介 JSONP 全称 JSON with padding(填充式 JSON 或参数式 JSON),JSONP实现跨域请求的原理,就是动态创建<script>标签,然后利用& ...

  3. ThinkPHP实现登录限制时__construct和_initialize的区别

    ThinkPHP支持两种构造方法:  __construct和_initialize(ThinkPHP内置的构造方法). 测试URL为:  http://oa.com/index.php/Admin/ ...

  4. java8函数式接口小例子

    // Function<T, R> -T作为输入,返回的R作为输出 Function<String,String> function = (x) -> {System.o ...

  5. C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器

    STL实践与分析 --引言.pair类型.关联容器 引言:     关联容器与顺序容器的本质差别在于:关联容器通过键[key]来存储和读取元素,而顺序容器则通过元素在容器中的位置顺序的存取元素. ma ...

  6. Android学习网站(1)

    收集了一些比较好的Android学习网站,希望对大家有所帮助: 1.http://developer.android.com/ Android官方网站,可惜被屏蔽了,需要使用FQ软件 2.http:/ ...

  7. Visual Studio中Debug和Release的区别

    在Visual Studio中,生成应用程序的时候有2种模式:Debug和Release.两者之间如何取舍呢? 假设有这么简单的一段代码,在主程序中调用方法M1,M1方法调用M2方法,M2方法调用M3 ...

  8. unity3d摄像机参数

    1. Clear Flags:清除标记.决定屏幕的哪部分将被清除.一般用户使用对台摄像机来描绘不同游戏对象的情况,有3中模式选择: Skybox:天空盒.默认模式.在屏幕中的空白部分将显示当前摄像机的 ...

  9. iOS获取网络类型的四种方法

    Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有 ...

  10. Android只播放gif动画

    使用easygifanimator软件把gif动画打散为图片. 第一步:先上图片素材,以下素材放到res/drawable目录下: 转:http://blog.csdn.net/aminfo/arti ...