android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
来源:互联网 发布:天下三萌妹捏脸数据 编辑:程序博客网 时间:2024/04/28 06:30
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() {@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable arg3) {Log.i("Show", "upload failed");}@Overridepublic 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、删除服务器文件代码
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() {@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable arg3) {Log.i("Show", "delete faile");}@Overridepublic 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> {@Overrideprotected void onPreExecute() {}@Overrideprotected 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 {// 服务器文件最新, 删除本地文件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;}@Overrideprotected 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数据的比较。
1 0
- android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
- Android 使用AsyncHttpClient文件上传与下载
- Android 使用开源框架AsyncHttpClient上传文件到服务器
- Android 使用开源框架AsyncHttpClient上传文件到服务器
- Android使用开源框架实现文件的上传 asyncHttpClient
- Android使用AsyncHttpClient上传多个文件
- Android使用HttpURLConnection上传文件
- 使用HttpURLConnection上传文件
- 使用HttpURLConnection上传文件
- 使用HttpUrlConnection上传文件
- 使用HttpURLConnection下载文件
- 使用HttpURLConnection下载文件
- 使用HttpURLConnection下载文件
- Android学习之使用HttpURLConnection下载文件
- Java使用HttpURLConnection上传文件
- Java使用HttpURLConnection上传文件
- Java使用HttpURLConnection上传文件
- Java使用HttpURLConnection上传文件
- 串的模式匹配算法
- CodeForces 622A Infinite Sequence
- 邮箱伪造详解2013-10-04
- 计算php脚本执行时间
- NSOperation
- android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
- 鹅厂2016实习笔试程序题
- iOS中UIViewController的生命周期以及viewDidLoad和viewWillAppear的注意事项
- 由浅到深理解闭包与匿名函数
- HDU_2586_How far away ?_MLE_floyd
- Ruby notes #1 Environment setup on Win32 platform
- 关于IOS生命周期和设计模式
- /启动引导/操作系统之后
- 从主文件中读取n个子文件夹中的图片(每一子文件中有两个文件夹,每两个文件中有18张图片)