Java 中HttpURLConnection附件上传的实例详解
Java中HttpURLConnection附件上传的实例详解
整合了一个自己写的采用Http做附件上传的工具,分享一下!
示例代码:
/**
*以Http协议传输文件
*
*@authormingxue.zhang@163.com
*
*/
publicclassHttpPostUtil{
privatefinalstaticchar[]MULTIPART_CHARS="-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.toCharArray();
privateURLurl;
privateHttpURLConnectionconn;
privateStringboundary=null;
privateMaptextParams=newHashMap();
privateMapfileparams=newHashMap();
publicHttpPostUtil(Stringurl)throwsException{
this.url=newURL(url);
}
//重新设置要请求的服务器地址,即上传文件的地址。
publicvoidsetUrl(Stringurl)throwsException{
this.url=newURL(url);
}
//增加一个普通字符串数据到form表单数据中
publicvoidaddTextParameter(Stringname,Stringvalue){
textParams.put(name,value);
}
//增加一个文件到form表单数据中
publicvoidaddFileParameter(Stringname,Filevalue){
fileparams.put(name,value);
}
//清空所有已添加的form表单数据
publicvoidclearAllParameters(){
textParams.clear();
fileparams.clear();
}
/**
*发送数据到服务器
*
*@return一个字节包含服务器的返回结果的数组
*@throwsException
*/
publicbyte[]send()throwsException{
initConnection();
try{
conn.connect();
}catch(SocketTimeoutExceptione){
thrownewException(e);
}
OutputStreamconnOutStream=newDataOutputStream(
conn.getOutputStream());
writeFileParams(connOutStream);
writeStringParams(connOutStream);
writesEnd(connOutStream);
InputStreamresponseInStream=conn.getInputStream();
ByteArrayOutputStreamresponseOutStream=newByteArrayOutputStream();
intlen;
byte[]bufferByte=newbyte[1024];
while((len=responseInStream.read(bufferByte))!=-1){
responseOutStream.write(bufferByte,0,len);
}
responseInStream.close();
connOutStream.close();
conn.disconnect();
byte[]resultByte=responseOutStream.toByteArray();
responseOutStream.close();
returnresultByte;
}
//文件上传的connection的一些必须设置
privatevoidinitConnection()throwsException{
StringBufferbuf=newStringBuffer("----");
Randomrand=newRandom();
for(inti=0;i<15;i++){
buf.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);
}
this.boundary=buf.toString();
conn=(HttpURLConnection)this.url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setConnectTimeout(3*60*1000);//连接超时为10秒
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary="+boundary);
}
//普通字符串数据
privatevoidwriteStringParams(OutputStreamout)throwsException{
SetkeySet=textParams.keySet();
for(Iteratorit=keySet.iterator();it.hasNext();){
Stringname=it.next();
Stringvalue=textParams.get(name);
out.write(("--"+boundary+"\r\n").getBytes());
out.write(("Content-Disposition:form-data;name=\""+name+"\"\r\n")
.getBytes());
out.write(("\r\n").getBytes());
out.write((encode(value)+"\r\n").getBytes());
}
}
//文件数据
privatevoidwriteFileParams(OutputStreamout)throwsException{
SetkeySet=fileparams.keySet();
for(Iteratorit=keySet.iterator();it.hasNext();){
Stringname=it.next();
Filevalue=fileparams.get(name);
out.write(("--"+boundary+"\r\n").getBytes());
out.write(("Content-Disposition:form-data;name=\""+name
+"\";filename=\""+encode(value.getName())+"\"\r\n")
.getBytes());
out.write(("Content-Type:"+getContentType(value)+"\r\n")
.getBytes());
out.write(("Content-Transfer-Encoding:"+"binary"+"\r\n")
.getBytes());
out.write(("\r\n").getBytes());
FileInputStreaminStream=newFileInputStream(value);
intbytes=0;
byte[]bufferByte=newbyte[1024];
while((bytes=inStream.read(bufferByte))!=-1){
out.write(bufferByte,0,bytes);
}
inStream.close();
out.write(("\r\n").getBytes());
}
}
//添加结尾数据
privatevoidwritesEnd(OutputStreamout)throwsException{
out.write(("--"+boundary+"--"+"\r\n").getBytes());
out.write(("\r\n").getBytes());
}
//获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream
privateStringgetContentType(Filef)throwsException{
StringfileName=f.getName();
if(fileName.endsWith(".jpg")){
return"image/jpeg";
}elseif(fileName.endsWith(".png")){
return"image/png";
}
return"application/octet-stream";
}
//对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码
privateStringencode(Stringvalue)throwsException{
returnURLEncoder.encode(value,"UTF-8");
}
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!