Android使用post方式上传图片到服务器的方法
本文实例讲述了Android使用post方式上传图片到服务器的方法。分享给大家供大家参考,具体如下:
/** *上传文件到服务器类 * *@authortom */ publicclassUploadUtil{ privatestaticfinalStringTAG="uploadFile"; privatestaticfinalintTIME_OUT=10*1000;//超时时间 privatestaticfinalStringCHARSET="utf-8";//设置编码 /** *Android上传文件到服务端 * *@paramfile需要上传的文件 *@paramRequestURL请求的rul *@return返回响应的内容 */ publicstaticStringuploadFile(Filefile,StringRequestURL){ Stringresult=null; StringBOUNDARY=UUID.randomUUID().toString();//边界标识随机生成 StringPREFIX="--",LINE_END="\r\n"; StringCONTENT_TYPE="multipart/form-data";//内容类型 try{ URLurl=newURL(RequestURL); HttpURLConnectionconn=(HttpURLConnection)url.openConnection(); conn.setReadTimeout(TIME_OUT); conn.setConnectTimeout(TIME_OUT); conn.setDoInput(true);//允许输入流 conn.setDoOutput(true);//允许输出流 conn.setUseCaches(false);//不允许使用缓存 conn.setRequestMethod("POST");//请求方式 conn.setRequestProperty("Charset",CHARSET);//设置编码 conn.setRequestProperty("connection","keep-alive"); conn.setRequestProperty("Content-Type",CONTENT_TYPE+";boundary="+BOUNDARY); if(file!=null){ /** *当文件不为空,把文件包装并且上传 */ DataOutputStreamdos=newDataOutputStream(conn.getOutputStream()); StringBuffersb=newStringBuffer(); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END); /** *这里重点注意:name里面的值为服务端需要key只有这个key才可以得到对应的文件 *filename是文件的名字,包含后缀名的比如:abc.png */ sb.append("Content-Disposition:form-data;name=\"uploadfile\";filename=\"" +file.getName()+"\""+LINE_END); sb.append("Content-Type:application/octet-stream;charset="+CHARSET+LINE_END); sb.append(LINE_END); dos.write(sb.toString().getBytes()); InputStreamis=newFileInputStream(file); byte[]bytes=newbyte[1024]; intlen=0; while((len=is.read(bytes))!=-1){ dos.write(bytes,0,len); } is.close(); dos.write(LINE_END.getBytes()); byte[]end_data=(PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes(); dos.write(end_data); dos.flush(); /** *获取响应码200=成功当响应成功,获取响应的流 */ intres=conn.getResponseCode(); Log.e(TAG,"responsecode:"+res); //if(res==200) //{ Log.e(TAG,"requestsuccess"); InputStreaminput=conn.getInputStream(); StringBuffersb1=newStringBuffer(); intss; while((ss=input.read())!=-1){ sb1.append((char)ss); } result=sb1.toString(); Log.e(TAG,"result:"+result); //} //else{ //Log.e(TAG,"requesterror"); //} } }catch(MalformedURLExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } returnresult; } /** *通过拼接的方式构造请求内容,实现参数传输以及文件传输 * *@paramurlServicenetaddress *@paramparamstextcontent *@paramfilespictures *@returnStringresultofServiceresponse *@throwsIOException */ publicstaticStringpost(Stringurl,Map<String,String>params,Map<String,File>files) throwsIOException{ StringBOUNDARY=java.util.UUID.randomUUID().toString(); StringPREFIX="--",LINEND="\r\n"; StringMULTIPART_FROM_DATA="multipart/form-data"; StringCHARSET="UTF-8"; URLuri=newURL(url); HttpURLConnectionconn=(HttpURLConnection)uri.openConnection(); conn.setReadTimeout(10*1000);//缓存的最长时间 conn.setDoInput(true);//允许输入 conn.setDoOutput(true);//允许输出 conn.setUseCaches(false);//不允许使用缓存 conn.setRequestMethod("POST"); conn.setRequestProperty("connection","keep-alive"); conn.setRequestProperty("Charsert","UTF-8"); conn.setRequestProperty("Content-Type",MULTIPART_FROM_DATA+";boundary="+BOUNDARY); //首先组拼文本类型的参数 StringBuildersb=newStringBuilder(); for(Map.Entry<String,String>entry:params.entrySet()){ sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition:form-data;name=\""+entry.getKey()+"\""+LINEND); sb.append("Content-Type:text/plain;charset="+CHARSET+LINEND); sb.append("Content-Transfer-Encoding:8bit"+LINEND); sb.append(LINEND); sb.append(entry.getValue()); sb.append(LINEND); } DataOutputStreamoutStream=newDataOutputStream(conn.getOutputStream()); outStream.write(sb.toString().getBytes()); //发送文件数据 if(files!=null) for(Map.Entry<String,File>file:files.entrySet()){ StringBuildersb1=newStringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition:form-data;name=\"uploadfile\";filename=\"" +file.getValue().getName()+"\""+LINEND); sb1.append("Content-Type:application/octet-stream;charset="+CHARSET+LINEND); sb1.append(LINEND); outStream.write(sb1.toString().getBytes()); InputStreamis=newFileInputStream(file.getValue()); byte[]buffer=newbyte[1024]; intlen=0; while((len=is.read(buffer))!=-1){ outStream.write(buffer,0,len); } is.close(); outStream.write(LINEND.getBytes()); } //请求结束标志 byte[]end_data=(PREFIX+BOUNDARY+PREFIX+LINEND).getBytes(); outStream.write(end_data); outStream.flush(); //得到响应码 intres=conn.getResponseCode(); InputStreamin=conn.getInputStream(); StringBuildersb2=newStringBuilder(); if(res==200){ intch; while((ch=in.read())!=-1){ sb2.append((char)ch); } } outStream.close(); conn.disconnect(); returnsb2.toString(); } }
示例调用第二种方式上传:
finalMap<String,String>params=newHashMap<String,String>(); params.put("send_userId",String.valueOf(id)); params.put("send_email",address); params.put("send_name",name); params.put("receive_email",emails); finalMap<String,File>files=newHashMap<String,File>(); files.put("uploadfile",file); finalStringrequest=UploadUtil.post(requestURL,params,files);
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。