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










posted @ 2017-08-13 15:16  yfceshi  阅读(2025)  评论(0编辑  收藏  举报