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数据的比較。