java

位置:IT落伍者 >> java >> 浏览文章

Java利用HttpURLConnection发送post请求上传文件


发布日期:2024年01月03日
 
Java利用HttpURLConnection发送post请求上传文件

在页面里实现上传文件不是什么难事写个form加上enctype = multipart/formdata在写个接收的就可以了没什么难的如果要用HttpURLConnection来实现文件上传还真有点搞头:)

先写个servlet把接收到的 HTTP 信息保存在一个文件中 看一下 form 表单到底封装了什么样的信息

Java代码

public void doPost(HttpServletRequest request HttpServletResponse response)

throws ServletException IOException {

//获取输入流是HTTP协议中的实体内容

ServletInputStream in=requestgetInputStream();

//缓沖区

byte buffer[]=new byte[];

FileOutputStream out=new FileOutputStream(d:\\testlog);

int len=sisread(buffer );

//把流里的信息循环读入到filelog文件中

while( len!= ){

outwrite(buffer len);

len=inreadLine(buffer );

}

outclose();

inclose();

}

来一个form表单

<form name=upform action=uploaddo method=POST

enctype=multipart/formdata>

参数<input type=text name=username/><br/>

文件<input type=file name=file/><br/>

文件<input type=file name=file/><br/>

<input type=submit value=Submit />

<br />

</form>

假如我参数写的内容是hello word然后二个文件是二个简单的txt文件上传后testlog里如下

Java代码

daec

ContentDisposition: formdata; name=username

hello word

daec

ContentDisposition: formdata; name=file; filename=D:\hahatxt

ContentType: text/plain

haha

hahaha

daec

ContentDisposition: formdata; name=file; filename=D:\huhutxt

ContentType: text/plain

messi

huhu

daec

研究下规律发现有如下几点特征

第一行是 dbbc 作为分隔符然后是 \r\n 回车换行符 这个dbbc 分隔符浏览器是随机生成的

第二行是ContentDisposition: formdata; name=file; filename=D:\huhutxt;name=对应input的name值filename对应要上传的文件名(包括路径在内)

第三行如果是文件就有ContentType: text/plain这里上传的是txt文件所以是text/plain如果上穿的是jpg图片的话就是image/jpg了可以自己试试看看

然后就是回车换行符

在下就是文件或参数的内容或值了hello word

最后一行是daec注意最后多了二个;

有了这些就可以使用HttpURLConnection来实现上传文件功能了

Java代码 public void upload(){

List<String> list = new ArrayList<String>(); //要上传的文件名d:\hahadoc你要实现自己的业务我这里就是一个空list

try {

String BOUNDARY = dadc; // 定义数据分隔线

URL url = new URL();

HttpURLConnection conn = (HttpURLConnection) urlopenConnection();

// 发送POST请求必须设置如下两行

connsetDoOutput(true);

connsetDoInput(true);

connsetUseCaches(false);

connsetRequestMethod(POST);

connsetRequestProperty(connection KeepAlive);

connsetRequestProperty(useragent Mozilla/ (compatible; MSIE ; Windows NT ; SV));

connsetRequestProperty(Charsert UTF);

connsetRequestProperty(ContentType multipart/formdata; boundary= + BOUNDARY);

OutputStream out = new DataOutputStream(conngetOutputStream());

byte[] end_data = (\r\n + BOUNDARY + \r\n)getBytes();// 定义最后数据分隔线

int leng = listsize();

for(int i=;i<leng;i++){

String fname = listget(i);

File file = new File(fname);

StringBuilder sb = new StringBuilder();

sbappend();

sbappend(BOUNDARY);

sbappend(\r\n);

sbappend(ContentDisposition: formdata;name=\file+i+\;filename=\+ filegetName() + \\r\n);

sbappend(ContentType:application/octetstream\r\n\r\n);

byte[] data = sbtoString()getBytes();

outwrite(data);

DataInputStream in = new DataInputStream(new FileInputStream(file));

int bytes = ;

byte[] bufferOut = new byte[];

while ((bytes = inread(bufferOut)) != ) {

outwrite(bufferOut bytes);

}

outwrite(\r\ngetBytes()); //多个文件时二个文件之间加入这个

inclose();

}

outwrite(end_data);

outflush();

outclose();

// 定义BufferedReader输入流来读取URL的响应

BufferedReader reader = new BufferedReader(new InputStreamReader(conngetInputStream()));

String line = null;

while ((line = readerreadLine()) != null) {

Systemoutprintln(line);

}

} catch (Exception e) {

Systemoutprintln(发送POST请求出现异常! + e);

eprintStackTrace();

}

}

               

上一篇:Java访问windows活动目录(2)

下一篇:Java终止函数深度分析