Applet结合Struts2实现文件上传

因为项目的须要,使用Applet实现文件上传被提上日程,做者关于applet实现文件上传googleN次,baidum次,终于搞定。最大的感触就是网上的资料有时候会误导你,须要不停的作实验,不停地寻找出现问题的解决方案。做者因为几个比较关键的地方网上的资料未提供,在此做为记录,但愿能对新手提供一些有用的参考。
关于文件上传的原理,能够 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)行做为分界符的结尾,注意,比第一行在最后多出两个“-“。第49行为空行,5-8行为须要写入二进制文件或者文本的地方。网上的一些资料没有讲这一部分,须要特别留意。
了解了文件上传的格式,就可使用applet向服务器端写入以上格式的内容,就能够实现把文件上传到服务器端了。若是服务器端使用Struts2,则框架为咱们接收了文件,就不用写servlet了。Struts2能够处理以POST方式提交的数据。下面讲述开发的客户端代码,服务器端的代码若是不清楚,能够参看Struts2的官方文档。
假设系统使用UTF-8编码,客户端调用Applet上传文件的代码
       String url=http://127.0.0.1:8080/upload.action// 接收文件的action
       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-typeStruts2中被解析为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
相关文章
相关标签/搜索