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页面 ...
随机推荐
- request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别(记录)
1.session.setAttribute()和session.getAttribute()配对使用,作用域是整个会话期间,在所有的页面都使用这些数据的时候使用. 2.request.setAttr ...
- Java_模拟comet的实现
本文没有使用任何comet服务器, 只是利用tomcat模拟实现了一下comet, 不是真正的comet哦,因为不会有这样的应用场景, 只是模拟实现, 仅供参考. 一. 需求. 实现将服务端的时间推送 ...
- ASP.NET Web API教程 分页查询
首先增加支持分页的API方法 public IEnumerable<UserInfo> GetUserInfos(int pageindex, int size) { ...
- JavaScript 新手的踩坑日记
引语 在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个名字.由于商标问题以及很多产品已经 ...
- Vue 组件 data为什么是函数?
在创建或注册模板的时候,传入一个data属性作为用来绑定的数据.但是在组件中,data必须是一个函数,而不能直接把一个对象赋值给它. Vue.component('my-component', { t ...
- MVC文件上传05-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义上传文件夹
在零配置情况下,文件的上传文件夹是根目录下的Files文件夹,如何自定义文件的上传文件夹呢? MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小 MVC文 ...
- andriod 播放mp4
权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> activi ...
- 微软Silverlight欲攻占iPhone和Android手机
微软日前表示,该公司正在努力把Silverlight视频技术引入手机市场.微软Silverlight视频技术被誉为“Flash杀手”,该公司前不久刚发布了Silverlight 2.0版. 尽管说苹果 ...
- java.lang.UnsatisfiedLinkError:no dll in java.library.path终极解决之道
Java调用Dll时,会出现no dll in java.library.path异常,在Java Project中不常见,因为只要将Dll拷贝到system32目录下即可: 但若是 ...
- 《Unix内核源码剖析》
<Unix内核源码剖析> 基本信息 作者: (日)青柳隆宏 译者: 殷中翔 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115345219 上架时间:2014-2 ...