android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
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下载文件的更多相关文章
- Android使用XUtils框架上传照片(一张或多张)和文本,server接收照片和文字(无乱码)
Android上传图片,这里我使用了如今比較流行的XUtils框架.该框架能够实现文件上传.文件下载.图片缓存等等,有待研究. 以下是Android端上传的代码: xUtils.jar下载 Strin ...
- jQuery用FormData对象实现文件上传以及如何通过ajax下载文件
之前在Vue的项目里面用到过文件上传,封装好的组件用起来比较顺手,查询Element-UI文档,十八般武器样样都有,一顿操作猛如虎,一看--跑偏了(⊙o⊙)-,我的意思就是用框架实现比较简单,但是如果 ...
- win端git连接私服仓库+上传本地项目+从服务器下载文件到win
win端git连接私服仓库: 1.win端 检查c:/Users/用户/.ssh/目录下是否有config文件(!!!没有任何后缀名).如果没有则新建config文件,然后修改添加如下内容: Host ...
- Android连接socket服务器上传下载多个文件
android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { ;// 端口号,必须与客户端一致 ...
- Android+Spring Boot 选择+上传+下载文件
2021.02.03更新 1 概述 前端Android,上传与下载文件,使用OkHttp处理请求,后端使用Spring Boot,处理Android发送来的上传与下载请求.这个其实不难,就是特别多奇奇 ...
- android+nutz后台如何上传和下载图片
android+nutz后台如何上传和下载图片 发布于 588天前 作者 yummy222 428 次浏览 复制 上一个帖子 下一个帖子 标签: 无 最近在做一个基于android的ap ...
- Struts2文件上传(基于表单的文件上传)
•Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目 •Commons-Fil ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- web操作文件的上传到服务器 并可下载 并且读取出来
1.文件的上传-servlet实现文件上传---核心API—DiskFileItemFactory 一.文件上传概述 l 实现web开发中的文件上传功能,需完成如下二步操作: • 在web页面 ...
随机推荐
- 关于多重嵌套的JSON数据解析
最近项目中需要封装一套复杂的数据模型返回给前端,大致就是一个用户会有多笔订单,每个订单下可能会有多笔保单, 大致的数据模型如下: 为了方面描述,先看一下一个用户下有一条订单,一条订单下有一个保险订单的 ...
- RN生命周期
网上看的博客,看着写的很好,想深入学RN的详细看下之后,再自己敲敲吧!有助于身体健康! 一个RN组件从它被加载,到最终被卸载会经历一个完整的生命周期.所谓生命周期,就是一个对象从开始生成到最后消亡所经 ...
- Disable File System Redirector For Windows x64 (Python recipe)(转)
This disables the Windows File System Redirector.When a 32 bit program runs on a 64 bit operating sy ...
- Scramble String -- LeetCode
原题链接: http://oj.leetcode.com/problems/scramble-string/ 这道题看起来是比較复杂的,假设用brute force,每次做分割,然后递归求解,是一个 ...
- LNMP下FTP服务器Pureftpd的安装和使用
LNMP一键安装包里的Pureftpd安装脚本是需要MySQL支持的,安装前需要已经安装好LNMP,这个自带一个PHP编写的用户管理界面. 安装 进入lnmp解压后的目录,执行:./pureftpd. ...
- ASP.NET Web Api 实现数据的分页
前言 这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可能会在系列的后期介绍,还没确定...),对于分页的结果,我们将采用2种不同的方式响应给客户端(1.将分 ...
- IP配制
http://blog.csdn.net/laoyiin/article/details/5722977
- 不用windows不会死
不用windows不会死 近期看到win8广告,仅仅要2999元. 事实上他们不知道,不用windows不但不会死,还会活得更好. 不信.你去问问那些非windows用户,他们是不是非常快乐?烦恼非常 ...
- 2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast”.
2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast” ...
- mormot当作内存数据库(缓存)使用
mormot当作内存数据库(缓存)使用 mormot的TSQLRestStorageInMemory可以作为内存数据库来使用. 上图是在笔者4代I5笔记本上做的测试,增加10万记录,耗时:562毫秒. ...