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页面 ...
随机推荐
- python mac环境搭建
安装 virtualenv $ sudo pip install virtualenv 然后建立一个测试目录: $ mkdir testvirtual $ cd testvirtual 就可以成功创建 ...
- ROS知识(17)----Actionlib使用的例子
1.Actionlib原理 英文版:DetailedDescription 翻译版:actionlib的身世之谜 2.Actionlib官方教程 Actionlib是ros的重要部件,对于复杂动作的执 ...
- SVN服务器与客户端下载地址_搭建使用
下载地址: http://subversion.apache.org/packages.html Windows CollabNet (supported and certified by Colla ...
- 华为S5300系列升级固件S5300SI-V100R003C00SPC301.cc
这个固件是升级V100R005的中间件,所以是必经的,注意,这个固件带有http的服务,但现在无论官网还是外面,几乎找不到这个固件的web功能,如果非要实现,可以拿V100R005的web文件改名为w ...
- HDU 4497 GCD and LCM (合数分解)
GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- 腾讯旗下网站的很多URL都包含“cgi-bin”,是什么意思?他们后台用什么语言?
cgi-bin 这很有可能说明后台是C/C++写的. 动态Web技术刚出来的时候, 服务器调用本地应用程序处理http请求的技术. 通常是C/C++程序. 后来有了新的web开发技术后这类用的就比较少 ...
- checked和unchecked的区别
int类型的最大值是2147483647,2个最大值相加就会超出int的最大值,即出现溢出. class Program { static void Main(string[] args) { int ...
- envi几何校正
转载自原文 介绍地理参考数据的知识以及ENVI 中图像对图像.图像对地图两种校正方法 1.打开基图像XX.img和待纠正的图像YY.img(不带地理信息,可以双击其主图像窗口可以在Cursor Loc ...
- Android之ConnectivityManager
在android平台中ConnectivityManager主要负责查询网络连接状态以及在连接状态有变化的时候发出通知.其主要的功能职责如下: 1. 监视网络状态,包括(Wi-Fi.GPRS.UMT ...
- 【maven】排除maven中jar包依赖的解决过程 例子:spring cloud启动zipkin,报错maven依赖jar包冲突 Class path contains multiple SLF4J bindings.
一直对于maven中解决jar包依赖问题的解决方法纠结不清: 下面这个例子可以说明一个很简单的解决方法: 项目启动报错: Connected to the target VM, address: '1 ...