andorid使用异步http框架和第三方HttpClinet上传文件

android使用异步http框架和第三方HttpClinet上传文件完整源码

首先我们先来看一下使用第三方HttpClinet的实现方式

这种实现方式需要用到一下3个jar包

commons-fileupload-1.2.1.jar  、  commons-io-1.4.jar  、  commons-httpclient-3.0.1.jar 。

这些jar已经包含在源码工程里边了

关于使用步骤我不多说,代码里边的注释已经写明

public void uploadByHttpClient(View view) {
		String path = this.et_path.getText().toString().trim();
		final String url = "http://110.65.99.66:8080/uploadfileServer/UploadFileServlet";
		final File file = new File(path);
		// 先判断文件是否存在
		if (file.exists() && file.length() > 0) {
			// 网络访问为耗时操作,应该放在子线程中执行
			new Thread() {
				public void run() {

					// 1. 创建第三方HttpClient对象
					HttpClient client = new HttpClient();

					// 2. 创建POST请求对象
					PostMethod post = new PostMethod(url);

					// 3. 设置请求体内容
					try {
						// 参数体
						Part[] ps = { new FilePart("file", file) };
						post.setRequestEntity(new MultipartRequestEntity(ps,
								post.getParams()));

						// 4. 获取连接器管理对象
						HttpConnectionManager manager = client
								.getHttpConnectionManager();

						// 5. 设置参数提交的等待时间
						manager.getParams().setConnectionTimeout(10000);

						// 6. 执行PostMethod方法
						client.executeMethod(post);

						// 7. 程序执行到这里,说明成功
						runOnUiThread(new Runnable() {

							@Override
							public void run() {
								Toast.makeText(MainActivity.this, "上传成功", 0)
										.show();
							}
						});

					} catch (Exception e) {
						e.printStackTrace();
						runOnUiThread(new Runnable() {

							@Override
							public void run() {
								Toast.makeText(MainActivity.this, "上传失败", 0)
										.show();
							}
						});
					}
				};
			}.start();
		} else {
			Toast.makeText(this, "文件不存在!", 0).show();
		}
	}

我们再来看看使用异步http框架的实现方式

安卓异步http框架是一个非常精巧的,用于andorid网络访问的开源框架。它简化了android自带的HttpClient的操作步骤。使用起来相对于上边的实现方式就简单多了

安卓异步框架源码下载

我们先要把下载下来的源码中library/src目录下的包给拷到安卓工程下的src目录

我们看一下核心实现代码

public void uploadByAsyncHttpClient(View view) {
		String path = this.et_path.getText().toString().trim();
		final String url = "http://110.65.99.66:8080/uploadfileServer/UploadFileServlet";
		final File file = new File(path);
		// 先判断文件是否存在
		if (file.exists() && file.length() > 0) {

			// 1. 创建AsyncHttpClient对象
			AsyncHttpClient client = new AsyncHttpClient();

			// 2.设置参数体
			RequestParams params = new RequestParams();
			try {
				// 其实这里的异常不可能出现,因为上边已经做了判断
				params.put("profile_picture", file);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			// 3.上传文件
			client.post(url, params, new AsyncHttpResponseHandler() {
				// 上传成功时回调的方法
				@Override
				public void onSuccess(int statusCode, Header[] headers,
						byte[] responseBody) {
					Toast.makeText(MainActivity.this, "上传成功!", 0).show();
				}

				// 上传失败时回调的方法
				@Override
				public void onFailure(int statusCode, Header[] headers,
						byte[] responseBody, Throwable error) {
					Toast.makeText(MainActivity.this, "上传失败!错误码:" + statusCode,
							0).show();
				}

			});
		} else {
			Toast.makeText(this, "文件不存在!", 0).show();
		}
	}



我们来对比一下上边两种实现方式

1.从实现步骤来看,第一种用了7步,第二种只用了3步,操作步骤大大简化

2.第一种方式需要将网络访问的代码放到子线程中去,否则在4.0以上的系统上运行会抛出android.os.NetworkOnMainThreadException,而第二种不用去考虑这个异常

3.因为将网络访问的代码放到了子线程中去,所以子线程中如果有UI的更新,需要去调用Activity的runOnUiThread()方法

经过对比,第二种方式的优越性就凸显出来了。所以安卓的文件上传建议使用异步http框架来实现。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 中使用 HttpClient 切片上传大文件,可以通过以下步骤实现: 1. 将文件切分为多个小块(切片)。你可以使用 FileStream 类来读取文件,并根据需要将文件切分为固定大小的块。 ```csharp string filePath = "your_file_path"; int chunkSize = 1024 * 1024; // 1MB using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[chunkSize]; int bytesRead; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) { // 在这里上传切片 // 可以将 buffer 作为参数传递给上传方法 } } ``` 2. 使用 HttpClient 发送每个切片到服务器。你可以使用 PostAsync 方法发送切片数据,并在请求头中指定当前切片的索引和总切片数。 ```csharp string uploadUrl = "your_upload_url"; int totalChunks = 10; // 假设文件切分为 10 个块 using (HttpClient client = new HttpClient()) { for (int chunkIndex = 0; chunkIndex < totalChunks; chunkIndex++) { byte[] chunkData = GetChunkData(chunkIndex); using (ByteArrayContent content = new ByteArrayContent(chunkData)) { content.Headers.Add("chunk-index", chunkIndex.ToString()); content.Headers.Add("total-chunks", totalChunks.ToString()); HttpResponseMessage response = await client.PostAsync(uploadUrl, content); // 处理响应 } } } ``` 3. 在服务器端接收切片并进行处理。你需要在服务器端实现一个接口来处理切片上传请求,并将每个切片保存到文件中。 具体的服务器端实现取决于你使用的服务器技术和框架。你可以根据自己的需求选择适合的方式来处理切片上传请求。 这只是一个基本的框架,你可以根据自己的需求进行修改和扩展。记得在实际应用中处理错误、上传进度等方面要进行适当的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值