之前利用java代码实现了文件的上传,见java模拟form表单提交文件到服务器,这里在Android中实现了上传文件到服务器,利用的是apache的httpclient包,下载地址:http://hc.apache.org/downloads.cgi。
具体实现代码如下:
public static int sendFileToServer(String url, File file) {
int status = 0;
try {
PostMethod filePost = new PostMethod(url );
Part[] parts = { new FilePart("datefile", file, null, "UTF-8"),
new StringPart("uuid", "12123123213", "UTF-8"),
new StringPart("username", "test", "UTF-8"),
new StringPart("types", "test", "UTF-8") };
MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(parts, filePost.getParams());
filePost.setRequestEntity(multipartRequestEntity);
HttpClient clients = new HttpClient();
status = clients.executeMethod(filePost);
BufferedReader rd = new BufferedReader(new InputStreamReader(filePost.getResponseBodyAsStream(), "UTF-8"));
StringBuffer stringBuffer = new StringBuffer();
String line;
while ((line = rd.readLine()) != null) {
stringBuffer.append(line);
}
rd.close();
// 这里需要解析json格式的字符串
Log.i("cat", stringBuffer.toString());
} catch (Exception e) {
return 500;
}
return status;
}
这里重点说一下Part[]这个参数:
Part[] parts = { new FilePart("datefile", file, null, "UTF-8"),
new StringPart("uuid", "12123123213", "UTF-8"),
new StringPart("username", "test", "UTF-8"),
new StringPart("types", "test", "UTF-8") };
数组中可以存放FilePart和StringPart不同类型的数据,FilePart就是需要上传的File对应的参数,StringPart是发送post请求的时候,其他需要传递的参数。
其实在实际开发中的需求一般会是利用一个上传队列来维护上传任务,这里可以利用java的线程池是实现:
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
sendFileToServer("", new File(Environment.getExternalStorageDirectory().toString() + File.separator + "aa.zip"));
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
sendFileToServer("", new File(Environment.getExternalStorageDirectory().toString() + File.separator + "aa.zip"));
}
});
executorService.shutdown();
这样就实现了队列线程上传文件,注意这不是多线程上传。
源码见:http://bigcateasymorse.googlecode.com/svn/trunk/androiduploadfiletoserver/