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

时间: 2024-08-07 00:12:32

android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件的相关文章

Android使用XUtils框架上传照片(一张或多张)和文字,服务器接收照片和文字(无乱码)

Android上传图片,这里我使用了现在比较流行的XUtils框架,该框架可以实现文件上传.文件下载.图片缓存等等,有待研究. 下面是Android段上传的代码: xUtils.jar下载 String uploadHost="http://192.168.1.100:8080/ReceiveImgFromAndroid/ReceiveImgServlet"; //服务器接收地址 RequestParams params=new RequestParams(); params.addB

Android连接socket服务器上传下载多个文件

android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { int port = 8888;// 端口号,必须与客户端一致 // 选择进行传输的文件(测试) String path = "C:\\Temp"; String filePath = "E:\\img.png"; Socket client; public static void main(Strin

android form表单上传文件

原文地址:http://menuz.iteye.com/blog/1282097 Android程序使用http上传文件 有时,在网络编程过程中需要向服务器上传文件.Multipart/form-data是上传文件的一种方式. Multipart/form-data其实就是浏览器用表单上传文件的方式.最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器.  Html代码   <form action="/Test

android+spring boot 选择,上传,下载文件

1 概述 前端android,上传与下载文件,使用OkHttp处理请求,后端使用spring boot+MVC,处理android发送来的上传与下载请求.这个其实不难,就是特别多奇奇怪怪的坑,因此,希望看到的,不要像笔者这样踩的那么痛苦了... 2 环境 win10 Spring Boot 2.2.2 RELEASE IDEA 2019.3.1 Android Studio 3.6RC1 Tomcat 9.0.30 3 android 3.1 准备工作 3.1.1 新建工程 这次用一个全新的例子

如何清空文件上传控件里的选定文件(路径)

我又来扯鸡毛蒜皮了.有名言曰人生短得不够扯鸡毛蒜皮,但我的工作就是由无数的鸡毛蒜皮组成,如之奈何? 今天的鸡毛和蒜皮是:如何清空文件上传控件里的选定文件(路径)? 场景是酱紫的: 有一个上传控件和一个按钮,其中上传控件隐藏.点击按钮,触发上传控件点击事件,于是弹出文件选择对话框:选好文件后,于是触发了上传控件的onchange事件.在这个事件里,将文件上传. 有点装逼,就是隐藏了上传控件.这可能是出于界面简约的考虑.问题是,同一个文件不能连续上传2次,因为路径不变,没有触发onchange事件.

Struts2文件上传(基于表单的文件上传)

•Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目 •Commons-FileUpload组件特点 –使用简单:可以方便地嵌入到JSP文件中,编写少量代码即可完成文件的上传功能 –能够全程控制上传内容 –能够对上传文件的大小.类型进行控制 •需要下载Common-FileUplaod框架地址(当然MyEclipce中Struts2支持里自带有这两个包): –http://jak

怎样清空文件上传控件里的选定文件(路径)

我又来扯鸡毛蒜皮了. 有名言曰人生短得不够扯鸡毛蒜皮,但我的工作就是由无数的鸡毛蒜皮组成,如之奈何? 今天的鸡毛和蒜皮是:怎样清空文件上传控件里的选定文件(路径)? 场景是酱紫的: 有一个上传控件和一个button.当中上传控件隐藏.点击button,触发上传控件点击事件,于是弹出文件选择对话框:选好文件后.于是触发了上传控件的onchange事件.在这个事件里.将文件上传. 有点装逼,就是隐藏了上传控件. 这可能是出于界面简约的考虑.问题是.同一个文件不能连续上传2次.由于路径不变,没有触发o

android/IOS常用图片上传的两种方式

android/IOS常用图片上传的两种方式: 1.上传到服务器的文件服务器(FileServer) 原理:上传到文件服务器的方式是先在服务器端搭建文件服务器,配置好路径(url),该路径是我们待会上传图片的路径,配置成功后便通过http+post的模式上传到文件服务器,同时文件服务器将返回一个图片ID,这个ID就是图片的唯一标识,并将该ID写入数据库保存,当需要下载该图片时只需要将此ID带上即可. 两个核心问题: (1)服务端:配置FileServer,并写处理响应上传图片的代码,这个值得去网

asp.net 上传XML,txt 直接读取文件内容

if (GetUploadFileContent.PostedFile.InputStream.Length < 1) { Msg.Text = "请选择文件";return; } string FileName = GetUploadFileContent.FileName;//上传文件文件名 string FilePath = GetUploadFileContent.PostedFile.FileName;//上传文件完整路径+文件名string fileExtName =