android上传图片(及普通参数)到服务器(j2ee后台服务器,ssh框

最近项目中需要客户端往服务器传输图片,并且还需要附带一些普通参数,研究了几天,,把结果记录下。

首先客户端可服务端进行通信一般都是有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请求类:

{//标签private String TAG=”HttpUrlConn”;//HttpURLConnection请求private HttpURLConnection myhttpconnect;//结束点private String end = “\r\n”;//分割标记twoHyphensprivate 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 {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”);myhttpconnect.setRequestProperty(“Content-Type”, “multipart/form-data;boundary=” + boundary);/* 设置DataOutputStream */ds = new DataOutputStream(myhttpconnect.getOutputStream());/*把普通参数写到服务器*/if(null!=paramString&&paramString.size()>0){writeStringParam(ds, paramString);}/*把文件参数写到服务器*/if(null!=paramFiles&&paramFiles.size()>0){writeFileParam(ds, paramFiles);}//添加结尾标志paramsEnd(ds);if(myhttpconnect.getResponseCode()==HttpURLConnection.HTTP_OK){InputStream is =myhttpconnect.getInputStream();String successMsg=InputStremtoString(is);//成功if(uploadlinsener!=null){uploadlinsener.uploadSucsess(successMsg);}}else{uploadlinsener.uploadFail(“错误,错误码ResponseCode:”+myhttpconnect.getResponseCode());}ds.close();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();if(uploadlinsener!=null){uploadlinsener.uploadFail(e.toString());}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();if(uploadlinsener!=null){uploadlinsener.uploadFail(e.toString());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();if(uploadlinsener!=null){uploadlinsener.uploadFail(e.toString());}}return myhttpconnect;}/*** 把字节输入流转换成字符串* @return*/private String InputStremtoString(InputStream is)throws Exception{int ch;StringBuffer b = new StringBuffer();byte[] bt=new byte[1024];while ((ch = is.read(bt)) != -1){b.append(new String(bt, 0, ch, “UTF-8”));}return b.toString();}/*** 传普通参数(第二种方法)* @param parm:参数*/private void writeStringParam(DataOutputStream ds,HashMap<String, String> params){try{Set<String> keySet = params.keySet();for (Iterator<String> it =keySet.iterator();it.hasNext();){String name = it.next();String value = params.get(name);ds.writeBytes(twoHyphens + boundary + end);ds.writeBytes(“Content-Disposition: form-data; name=\”” + name +”\””+ end);ds.writeBytes(end);//URLEncoder.encode(value)ds.writeBytes(new String(value.getBytes(),”UTF-8″)+ end);}}catch(Exception e){e.printStackTrace();}}/**** 传输文件* @param ds :数据传输通道* @param params :参数*/private void writeFileParam(DataOutputStream ds,HashMap<String, File> params){try{Set<String> keySet = params.keySet();getFilesSize(params);for (Iterator<String> it =keySet.iterator();it.hasNext();){String name = it.next();File value = params.get(name);ds.writeBytes(twoHyphens + boundary + end);ds.writeBytes(“Content-Disposition: form-data; name=\”” + name + “\”; filename=\”” + URLEncoder.encode(value.getName()) + “\””+end);ds.writeBytes(“Content-Type: ” + getContentType(value) + end);ds.writeBytes(end);ds.write(getBytes(value));ds.writeBytes(end);}}catch(Exception e){e.printStackTrace();}}/*** 获取要传输文件总共大小* @param params*/private void getFilesSize(HashMap<String, File> params){for(Entry<String, File> data:params.entrySet()){File f=data.getValue();allFilesize+=f.length();}Log.i(TAG, “AllFileSize:”+allFilesize);}/*** 获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream * @param f 文件 * @return * @throws Exception*/private String getContentType(File f) throws Exception{return “application/octet-stream”;}/*** 添加结尾数据 * @param ds:数据传输通道* * @throws Exception*/private void paramsEnd( DataOutputStream ds) throws Exception {ds.writeBytes(twoHyphens + boundary +twoHyphens + end);ds.writeBytes(end);}/*** 把文件转换成字节数组* @param f:文件* @return* @throws Exception*/private byte[] getBytes(File f) throws Exception{FileInputStream in = new FileInputStream(f);ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] b = new byte[1024];int n;while ((n = in.read(b)) != -1){out.write(b, 0, n);if(allFilesize>0){curr_ret+=n;double level=(curr_ret/allFilesize)*100;Log.i(“result”, “”+level);if(uploadlinsener!=null){uploadlinsener.uploading(level);}}}in.close();return out.toByteArray();}public void setUploadlinsener(UploadLinsener uploadlinsener) {this.uploadlinsener = uploadlinsener;}} 如果寒暄只是打个招呼就了事的话,那与猴子的呼叫声有什么不同呢?事实上,

android上传图片(及普通参数)到服务器(j2ee后台服务器,ssh框

相关文章:

你感兴趣的文章:

标签云: