最近项目中需要客户端往服务器传输图片,并且还需要附带一些普通参数,研究了几天,把结果记录下。
首先客户端可服务端进行通信一般都是有http请求来发送和接收数据,这里android中有两种HttpClient和HttpURLConnection,这两个都可以和后台服务器进行网络通信,但是如何选择哪个来进行文件传输呢?
谷歌官方是提倡我们使用HttpURLConnection来和服务器进行通信(这个是在android.jar中就有),HttpClient这个是org.apache.http.client.HttpClient下的一个工具类,根据网上的一些测试,得出的一些理论结果是使用HttpURLConnection来传输文件比HttpClient要快一些,在普通参数传输上都差不多。
既然谷歌推荐,所以我么这里就选择HttpURLConnection来实现传输文件。
android客户端
效果图非常简单
Android客户端逻辑:
1: 点击选图片—>打开系统的相册选择;
2:点击上传图片,把图片上传到服务器,然后显示进度,以及上传完成后显示服务器返回的json数据。首先看看项目的结构
- 显示的界面在MainAcvtitvity中;
- ConfigParamters是http请求的公共参数配置;
- HttpUrlConn是http请求主要类;
- Uploadllinsener用来监听文件上传的进度,以及上传的状态(成功,失败,进度)。这里主要是看看HttpUrlConn请求类:
public class HttpUrlConn {
//标签
private String TAG="HttpUrlConn";
//HttpURLConnection请求
private HttpURLConnection myhttpconnect;
//结束点
private String end = "\r\n";
//分割标记twoHyphens
private String twoHyphens = "--";
//分割标记
private String boundary = "*****";
//数据输出管道
private DataOutputStream ds=null;
//文件上传监听
private UploadLinsener uploadlinsener;
//文件总大小
private double allFilesize=0;
//当前传输了多少
private double curr_ret=0;
/**
* HttpURLConnection连接服务器请求
* @param path :接口地址
* @param param1 :普通参数
* @param paramFiles:需要上传的文件参数
* @param config:连接公共属性配置
* @return
*/
public HttpURLConnection getHttpUrlConnInstances(String path,
HashMap<String, String> paramString,
HashMap<String, File> paramFiles,
ConfigParamters config){
try {
//这里可以放普通参数,(第一种方法)
// StringBuffer sb=new StringBuffer(path);
// if(null!=paramString&¶mString.size()>0){
// sb.append("?");
// for(Entry<String, String> data:paramString.entrySet()){
// sb.append(data.getKey()+"="+data.getValue());
// sb.append("&");
// }
// }
// path=sb.substring(0, sb.lastIndexOf("&"));
URL url=new URL(path);
myhttpconnect=(HttpURLConnection)
url.openConnection();
/* 允许Input、Output,post中不使用Cache */
myhttpconnect.setDoInput(config.isDoInput());
myhttpconnect.setDoOutput(config.isDoOutput());
myhttpconnect.setUseCaches(config.isUseCaches());
/* 设置传送的method=POST */
myhttpconnect.
setRequestMethod(config.getUseMethod());
/*设置属性 setRequestProperty */
myhttpconnect
.setRequestProperty("Connection", "Keep-Alive");
myhttpconnect.setRequestProperty("Charset", "UTF-8");