因为项目的须要,使用Applet实现文件上传被提上日程,做者关于applet实现文件上传google了N次,baidu了m次,终于搞定。最大的感触就是网上的资料有时候会误导你,须要不停的作实验,不停地寻找出现问题的解决方案。做者因为几个比较关键的地方网上的资料未提供,在此做为记录,但愿能对新手提供一些有用的参考。
关于文件上传的原理,能够
baidu
一下,网上的资料说得比较明白,在这里略微提一下,文件经过
html
上传须要设置提交
form
表单的表单元素的
enctype=” multipart/form-data”
原理是,经过为表单元素设置
enctype=”multipart/form-data”
属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的
Servlet
中用二进制流来获取内容,就能够取得上传文件的内容,从而实现文件的上传。文件上传后在服务器端得表示以下
(
选择文本
)
:
当上面文件执行之后会产生以下结果:(选择的上传文件不一样,结果相似)
(1) -----------------------------7d
45a
76025c
(2) Content-Disposition: form-data; name="text1"; filename=" D:\1.txt"
(3) Content-Type: text/plain
(4)
(5) public static void main(String[] args) {
(6) FileUtil.makeDir("dir1/dir2/dir3/dir4","c:/java/");
(7) }
(8) }
(9)
(10) -----------------------------7d
45a
76025c
--
其中第一行为分界符,和(10)行同样,第(10)行做为分界符的结尾,注意,比第一行在最后多出两个“-“。第4,9行为空行,5-8行为须要写入二进制文件或者文本的地方。网上的一些资料没有讲这一部分,须要特别留意。
了解了文件上传的格式,就可使用applet向服务器端写入以上格式的内容,就能够实现把文件上传到服务器端了。若是服务器端使用Struts2,则框架为咱们接收了文件,就不用写servlet了。Struts2能够处理以POST方式提交的数据。下面讲述开发的客户端代码,服务器端的代码若是不清楚,能够参看Struts2的官方文档。
假设系统使用UTF-8编码,客户端调用Applet上传文件的代码
HttpURLConnection con = (HttpURLConnection) new URL(url) .openConnection();//打开链接
String boundary=”------------------------
-123456”
;//设置的分解符比实际用的少2个“-“
String twoHypeLine=” -- “;
String lineEnd=”\r\n”;
con.setDoOutput(true);
conn.setUseCaches(false);
//
Use a post method.POST
为大写
conn.setRequestMethod("POST");
con.setRequestProperty("Accept", "*/*");
con.setRequestProperty("Accept-Language", "zh-cn");
//设置分隔符
con.setRequestProperty("Content-Type",
"multipart/form-data; boundary="+boundary);
con.setRequestProperty("Accept-Encoding", "gzip, deflate");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Cache-Control", "no-cache");
// 设置流式输出的请求头和请求尾
String header =( twoHypeLine + twoHypeLine +boundary+lineEnd+
+ "Content-Disposition: form-data; name=\"upload\"; filename=\"%s\" " +lineEnd+ "Content-Type: application/octet-stream "+ lineEnd+ lineEnd;
//name属性能够理解为<input type=”file”>中的name属性,在Struts2中被解析为uploadFileName属性
//content-type在Struts2中被解析为UploadContentType
byte[] tailbyte =( lineEnd + twoHypeLine +boundary+ twoHypeLine+ lineEnd)
.getBytes();
//文件名种包含中文时,必定要记得使用utf-8
byte[] headByte = String.format(header, file.getName()).getBytes(“utf
-8”
);
// 设置请求体的长度(直接输出,避免在本地进行缓存),同时链接服务器
con.setFixedLengthStreamingMode((int) file.length() + headByte.length+ tailbyte.length);
con.connect();
// 写文件流到请求体中
OutputStream dos = con.getOutputStream();
dos.write(headByte); // 写文件头
//file为本地打开的文件
FileInputStream fis = new FileInputStream(file);
int len = 0;
byte b[] = new byte[blockSize];
while (len != -1) {
len = fis.read(b);
if (len > 0) {
dos.write(b, 0, len);
dos.flush();
uploadStatus.upload(len);
}
}
fis.close();
dos.write(tail);
dos.close();
至此文件基本上能够正确的写入到服务器端,那么如何从服务器端读取哪?上传以后的文件能够经过json格式回传数据,在Struts2中只须要设置为返回类型为json便可,
InputStream is = con.getInputStream();
byte[] response = new byte[is.available()];
is.read(response);
JsonObject jo=new JsonObject(new String(response.getBytes(“UTF
-8”
)));
因为回传的数据为UTF-8格式的,必须经过转码才能被JSON对象识别,对于返回的数据,能够作你想作的任何处理,好比在页面上显示等等。固然在上传过程当中能够实现进度条。
祝
君好运。
参考网站: http://mupload.googlecode.com