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程序设计有所帮助。