您的位置:首页 > 理论基础 > 计算机网络

利用AsyncHttpClient实现图片的上传与下载+进度条

2015-04-28 14:47 288 查看
利用AsyncHttpClient实现图片的上传与下载+
进度条

图片上传

[java] view
plaincopy





/**

* @param path

* 要上传的文件路径

* @param url

* 服务端接收URL

* @throws Exception

*/

public static void uploadFile(String path, String url) throws Exception {

File file = new File(path);

if (file.exists() && file.length() > 0) {

AsyncHttpClient client = new AsyncHttpClient();

RequestParams params = new RequestParams();

params.put("uploadfile", file);

// 上传文件

client.post(url, params, new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers,

byte[] responseBody) {

// 上传成功后要做的工作

Toast.makeText(mContext, "上传成功", Toast.LENGTH_LONG).show();

progress.setProgress(0);

}



@Override

public void onFailure(int statusCode, Header[] headers,

byte[] responseBody, Throwable error) {

// 上传失败后要做到工作

Toast.makeText(mContext, "上传失败", Toast.LENGTH_LONG).show();

}



@Override

public void onProgress(int bytesWritten, int totalSize) {

// TODO Auto-generated method stub

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) {

// TODO Auto-generated method stub

super.onRetry(retryNo);

// 返回重试次数

}



});

} else {

Toast.makeText(mContext, "文件不存在", Toast.LENGTH_LONG).show();

}

图片下载

[java] view
plaincopy





/**

* @param url

* 要下载的文件URL

* @throws Exception

*/

public static void downloadFile(String url) throws Exception {



AsyncHttpClient client = new AsyncHttpClient();

// 指定文件类型

String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" };

// 获取二进制数据如图片和其他文件

client.get(url, new BinaryHttpResponseHandler(allowedContentTypes) {



@Override

public void onSuccess(int statusCode, Header[] headers,

byte[] binaryData) {

String tempPath = Environment.getExternalStorageDirectory()

.getPath() + "/temp.jpg";

// TODO Auto-generated method stub

// 下载成功后需要做的工作

progress.setProgress(0);

//

Log.e("binaryData:", "共下载了:" + binaryData.length);

//

Bitmap bmp = BitmapFactory.decodeByteArray(binaryData, 0,

binaryData.length);



File file = new File(tempPath);

// 压缩格式

CompressFormat format = Bitmap.CompressFormat.JPEG;

// 压缩比例

int quality = 100;

try {

// 若存在则删除

if (file.exists())

file.delete();

// 创建文件

file.createNewFile();

//

OutputStream stream = new FileOutputStream(file);

// 压缩输出

bmp.compress(format, quality, stream);

// 关闭

stream.close();

//

Toast.makeText(mContext, "下载成功\n" + tempPath,

Toast.LENGTH_LONG).show();



} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



}



@Override

public void onFailure(int statusCode, Header[] headers,

byte[] binaryData, Throwable error) {

// TODO Auto-generated method stub

Toast.makeText(mContext, "下载失败", Toast.LENGTH_LONG).show();

}



@Override

public void onProgress(int bytesWritten, int totalSize) {

// TODO Auto-generated method stub

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) {

// TODO Auto-generated method stub

super.onRetry(retryNo);

// 返回重试次数

}



});

PHP服务端

[php] view
plaincopy





<?php

$base_path = "./upload/"; // 接收文件目录

$target_path = $base_path . basename ( $_FILES ['uploadfile'] ['name'] );

if (move_uploaded_file ( $_FILES ['uploadfile'] ['tmp_name'], $target_path )) {

$array = array (

"code" => "1",

"message" => $_FILES ['uploadfile'] ['name']

);

echo json_encode ( $array );

} else {

$array = array (

"code" => "0",

"message" => "There was an error uploading the file, please try again!" . $_FILES ['uploadfile'] ['error']

);

echo json_encode ( $array );

}

?>

Service中类似的异常问题:

(com.zajt.zajtsafechat.http.AsyncHttpResponseHandler$ResponderHandler) {42843450} sending message to a Handler on a dead thread

解决办法:

在Service中,AsyncHttpClient client = new SyncHttpClient();

在Activity中,AsyncHttpClient client = new AsyncHttpClient();

其中SyncHttpClient是AsyncHttpClient的子类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: