JspSmartUpload上传下载 的实现攻略
(2012-09-06 20:07:18)一、文件上传篇
㈠ 表单要求
对于上传文件的FORM表单,有两个要求:
1、METHOD应用POST,即METHOD="POST"。
2、增加属性:ENCTYPE="multipart/form-data"
此时我们上传的不是单单文本数据,即此时要封装表单(以媒体的形式封装))
#############################################
HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是" "。附加参数还能被认为是一个查询字符串。
表单enctype属性有:
#####################################################
下面是一个用于上传文件的FORM表单的例子:
<FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="/JSPSmartUpload/upload.JSP"> <INPUT TYPE="FILE" NAME="MYFILE"> <INPUT TYPE="SUBMIT"> </FORM> |
㈡ 上传的例子
1、上传页面upload.html
本页面提供表单,让用户选择要上传的文件,点击"上传"按钮执行上传操作。
页面源码如下:
<!-- 文件名:upload.html 作 者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com) --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>文件上传</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <p> </p> <p align="center">上传文件选择</p><FORM METHOD="POST" ACTION="JSP/do_upload.JSP" ENCTYPE="multipart/form-data"><input type="hidden" name="TEST" value="good"> <table width="75%" border="1" align="center"> <tr> <td><div align="center">1、 <input type="FILE" name="FILE1" size="30"> </div></td> </tr> <tr> <td><div align="center">2、 <input type="FILE" name="FILE2" size="30"> </div></td> </tr> <tr> <td><div align="center">3、 <input type="FILE" name="FILE3" size="30"> </div></td> </tr> <tr> <td><div align="center">4、 <input type="FILE" name="FILE4" size="30"> </div></td> </tr> <tr> <td><div align="center"> <input type="submit" name="Submit" value="上传它!"> </div></td> </tr> </table> </FORM> </body> </html> |
2、上传处理页面do_upload.JSP
本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法,在此不赘述了。
页面源码如下:(首先要导入com.JSPsmart.upload.*)
iii、保存文件(两种方式)
<%-- 文件名:do_upload.JSP 作 者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com) --%> <%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,com.JSPsmart.upload.*" errorPage="" %> <html> <head> <title>文件上传处理页面</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <% // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 上传初始化 su.initialize(pageContext); // 设定上传限制 // 1.限制每个上传文件的最大长度。 // su.setMaxFileSize(10000); // 2.限制总上传数据的长度。 // su.setTotalMaxFileSize(20000); // 3.设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。 // su.setAllowedFilesList("doc,txt"); |
#####:###############################################################################
因为在1中我们封装表单(ENCTYPE="multipart/form-data"),所以当表单中含有要发送的文本数据时,在2中处理页面do_upload.JSP中 我们通过jsp的内置对象request时无法取得该请求参数值得,要通过req = su.getRequest();得到件jspSmart的request,进而通过该request获取请求参数
######################################################################################
四、文件下载篇
1、下载链接页面download.html
页面源码如下:
<!-- 文件名:download.html 作 者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com) --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>下载</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <a href="JSP/do_download.JSP">点击下载</a> </body> </html> |
2、下载处理页面do_download.JSP do_download.JSP展示了如何利用JSPSmartUpload组件来下载文件,从下面的源码中就可以看到,下载何其简单。
源码如下:
<%@ page contentType="text/html;charset=gb2312" import="com.JSPsmart.upload.*" %> <% // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始化 |
注意,执行下载的页面,在Java脚本范围外(即<% ... %>之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。不信的话,可以在上述源码中%><%之间加入一个 换行符,再下载一下,保证出错。因为它影响了返回给浏览器的数据流,导致解析出错。
3、如何下载中文文件
JSPSmartUpload虽然能下载文件,但对中文支持不足。若下载的文件名中有汉字,则浏览器在提示另存的文件名时,显示的是一堆乱码,很扫人兴。上面的例子就是这样。(这个问题也是众多下载组件所存在的问题,很少有人解决,搜索不到相关资料,可叹!)
为了给JSPSmartUpload组件增加下载中文文件的支持,我对该组件进行了研究,发现对返回给浏览器的另存文件名进行UTF-8编码后,浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对JSPSmartUpload组件的SmartUpload类做了升级处理,增加了toUtf8String这个方法,改动部分源码如下:
public void downloadFile(String s, String s1, String s2, int i) throws ServletException, IOException, SmartUploadException { if(s == null) throw new IllegalArgumentException |
注意源码中粗体部分,原JSPSmartUpload 组件对返回的文件未作任何处理,现在做了编码的转换工作,将文件名转换为UTF-8形式的编码形式。UTF-8编码对英文未作任何处理,对中文则需要转换 为%XX的形式。toUtf8String方法中,直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码,之后将其转换为%XX的形式。
将源码编译后打包成JSPSmartUpload.jar, 拷贝到Tomcat的shared/lib目录下(可为所有WEB应用程序所共享),然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。 另,toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接。