zoukankan      html  css  js  c++  java
  • 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数据的比較。










  • 相关阅读:
    查询Python支持的.whl格式
    内置模块之os
    内置标准库之time
    迭代器(iterator)
    STM32F103和SIM800L打造低成本短信转发系统(五):控制程序
    STM32F103和SIM800L打造低成本短信转发系统(四):MDK-ARM
    STM32F103和SIM800L打造低成本短信转发系统(三):STM32CubeMX
    STM32F103和SIM800L打造低成本短信转发系统(二):软件安装篇
    STM32F103和SIM800L打造低成本短信转发系统(一):硬件篇
    处理SIM800L模块的时间字符串之URL编码(百分号编码)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7353596.html
Copyright © 2011-2022 走看看