在页面里实现上传文件不是什么难事写个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();
}
}