在实现一个Android的WEB服务客户端,比如微博,论坛客户端时,经常会使用到图片的上传和下载。在这里介绍如何利用HttpClient实现图片的上传和下载功能。
1 图片上传:上传图片时,首先获得图片的路径,创建文件,并将图片转化为字节流写入到request,并发送该请求。
客户端代码:
- "font-size:16px;">
File file = new File(imageUrl); -
String httpUrl = httpDomain+"AddImageServlet"+"?gid="+gid; -
HttpPost request = new HttpPost(httpUrl); -
HttpClient httpClient = new DefaultHttpClient(); -
FileEntity entity = new FileEntity(file,"binary/octet-stream"); -
HttpResponse response; - try
{ -
request.setEntity(entity); -
entity.setContentEncoding("binary/octet-stream"); -
response = httpClient.execute(request); -
- //如果返回状态为200,获得返回的结果
-
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ - ……//图片上传成功
- }
- }
- catch(Exception
e){ - }
-
服务器端所做的工作则是接收该字节流,写入文件中,并在服务器中相应文件夹中保存该文件,并记录该文件的路径,将图片文件路径写入到数据库中保存。
服务器端代码:
- "font-size:16px;">//获得新闻id
-
String gid = request.getParameter("gid"); -
String filePath = getRealPath(request) + "\\userpic\\"; -
// 定义上载文件的最大字节 -
int MAX_SIZE = 102400 * 102400; -
// 声明文件读入类 -
DataInputStream in = null; -
FileOutputStream fileOut = null; -
// 取得客户端上传的数据类型 -
String contentType = request.getContentType(); -
if(contentType.indexOf("binary/octet-stream") >= 0){ -
// 读入上传的数据 -
in = new DataInputStream(request.getInputStream()); -
int formDataLength = request.getContentLength(); -
// 如果图片过大 -
if(formDataLength > MAX_SIZE){ -
String errormsg=("上传的文件字节数不可以超过" + MAX_SIZE); -
out.println(errormsg); -
return ; -
} -
// 保存上传文件的数据 -
byte dataBytes[] = new byte[formDataLength]; -
int byteRead = 0; -
int totalBytesRead = 0; -
// 上传的数据保存在byte数组 -
while(totalBytesRead < formDataLength){ -
byteRead = in.read(dataBytes,totalBytesRead,formDataLength); -
totalBytesRead += byteRead; -
} -
String fileName = filePath + gid+".png"; -
// 检查上载文件的目录是否存在 -
File fileDir = new File(filePath); -
if(!fileDir.exists()){ -
fileDir.mkdirs(); -
} -
// 创建文件的写出类 -
fileOut = new FileOutputStream(fileName); -
// 保存文件的数据 -
fileOut.write(dataBytes); -
fileOut.close(); -
-
//保存文件的路径名 - ……
-
2 图片下载:首先获得网络图片的图片地址,发送请求后,服务器将会返回该图片的字节流,利用BitmapFactory.decodeStream()方法将字节流转化为图片并返回。具体代码如下:
- "font-size:16px;">//获得网络中的图片
-
public Bitmap getGossipImage(String gid){ -
String httpUrl = httpDomain+"userpic/"+gid+".png"; -
Bitmap bitmap = null; -
HttpGet httpRequest = new HttpGet(httpUrl); -
//取得HttpClient 对象 -
HttpClient httpclient = new DefaultHttpClient(); -
try { -
//请求httpClient ,取得HttpRestponse -
HttpResponse httpResponse = httpclient.execute(httpRequest); -
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ -
//取得相关信息 取得HttpEntiy -
HttpEntity httpEntity = httpResponse.getEntity(); -
InputStream is = httpEntity.getContent(); -
bitmap = BitmapFactory.decodeStream(is); -
is.close(); -
}else{ -
Toast.makeText(context, "连接失败!", Toast.LENGTH_SHORT).show(); -
} -
-
} catch (ClientProtocolException e) { -
e.printStackTrace(); -
} catch (IOException e) { -
e.printStackTrace(); -
} -
return bitmap; -
} -