Java 中HttpURLConnection附件上传的实例详解
Java中HttpURLConnection附件上传的实例详解
整合了一个自己写的采用Http做附件上传的工具,分享一下!
示例代码:
/** *以Http协议传输文件 * *@authormingxue.zhang@163.com * */ publicclassHttpPostUtil{ privatefinalstaticchar[]MULTIPART_CHARS="-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" .toCharArray(); privateURLurl; privateHttpURLConnectionconn; privateStringboundary=null; privateMaptextParams=newHashMap (); privateMap fileparams=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{ Set keySet=textParams.keySet(); for(Iterator it=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{ Set keySet=fileparams.keySet(); for(Iterator it=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"); } }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!