?
class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%; text-indent: 21.2pt;">文件上传是做JavaWeb项目中经常使用的功能,而SmartUpload是一个可免费使用的全功能的文件上传下载组件。虽然此组件最近很少有更新,但由于其简单易用,对于一般的项目来说还是一个很好的选择。下面以一个具体的例子来说明此组件的使用。
?
首先,将SmartUplaod的jar文件放入项目的lib目录中。
?
然后,我们开发上传用的JSP页面,为了简单起见,本表单中仅包含了用户上传文件的文件域和一个上传按钮。效果如下:
?
需要注意的是,表单中使用了文件域,则表单提交类型(method)必须为post而且添加enctype="multipart/form-data"。
?
有了上传页面,下面编写处理上传的Servlet,代码如下:
?
publicclassUploadServletextendsHttpServlet {
??? privatestaticfinallongserialVersionUID = 1L;
?
??? protectedvoiddoPost(HttpServletRequest request,
?????????? HttpServletResponse response) throwsServletException, IOException {
?????? // 对象输出声明
?????? response.setContentType("text/html;charset=utf-8");
?????? PrintWriter out = response.getWriter();
?????? // 准备上传的目录
?????? String path = this.getServletContext().getRealPath("photo");
?????? File fpath = new File(path);
?????? if (!fpath.exists()) {
?????????? fpath.mkdir();
?????? }
?????? // 实例化组件
?????? SmartUploadsu = newSmartUpload("utf-8");
?????? // 初始化组件
?????? su.initialize(this.getServletConfig(), request, response);
?????? // 上传限制
?????? su.setMaxFileSize(50 * 1024); // 设置大小50K
?????? su.setAllowedFilesList("gif,png,jpg"); // 设置上传类型
?????? try {
?????????? // 上传文件
?????????? su.upload();
?????????? // 获取上传的第一个文件
?????????? SmartFile file = su.getFiles().getFile(0);
?????????? // 判断是否有文件上传,没有选择文件则提示用户
?????????? if (file.isMissing()) {
????????????? out.println("<script>alert('请选择要上传的文件!');location.href='upload.jsp';</script>");
????????????? return;
?????????? }
?????????? // 按照规则准备文件名按规则
?????????? String fname = new Date().getTime()
????????????????? + (newRandom().nextInt(900) + 100) + "."
????????????????? + file.getFileExt();
?????????? // 把文件从缓存区转移到指定目录中
?????????? file.saveAs(path + "/" + fname);
?????????? out.println("<script>alert('文件上传成功!');location.href='upload01.jsp';</script>");
?
?????? } catch (SecurityException e) {
?????????? e.printStackTrace();
?????????? // 违反上传限制的异常处理
?????????? out.println("<script>alert('请选择合法的文件!');location.href='upload01.jsp';</script>");
?????? } catch (SmartUploadException e) {
?????????? e.printStackTrace();
?????????? out.println("<script>alert('文件上传失败!');location.href='upload01.jsp';</script>");
?????? }
??? }
}
?
以上代码实现了单文件上传处理,添加了注释方便阅读。其中核心就是使用了SmartFile类,这个类的主要方法如下:
?
1、saveAs作用:将文件换名另存。
?
原型:
?
public void saveAs(java.lang.StringdestFilePathName)
?
或
?
public void saveAs(java.lang.StringdestFilePathName, intoptionSaveAs)
?
其中,destFilePathName是另存的文件名,optionSaveAs是另存的选项,该选项有三个值,分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL,SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件,SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件,SAVEAS_AUTO则表示让组件决定,当Web应用程序的根目录存在另存文件的目录时,它会选择SAVEAS_VIRTUAL,否则会选择SAVEAS_PHYSICAL。
?
2、isMissing
?
作用:这个方法用于判断用户是否选择了文件,也即对应的表单项是否有值。选择了文件时,它返回false。未选文件时,它返回true。
?
原型:publicbooleanisMissing()
?
3、getFieldName
?
作用:取HTML表单中对应于此上传文件的表单项的名字。
?
原型:public String getFieldName()
?
4、getFileName
?
作用:取文件名(不含目录信息)
?
原型:public String getFileName()
?
5、getFilePathName
?
作用:取文件全名(带目录)
?
原型:public String getFilePathName
?
6、getFileExt
?
作用:取文件扩展名(后缀)
?
原型:public String getFileExt()
?
7、getSize
?
作用:取文件长度(以字节计)
?
原型:publicintgetSize()
?
8、getBinaryData
?
作用:取文件数据中指定位移处的一个字节,用于检测文件等处理。
?
原型:public byte getBinaryData(int index)。其中,index表示位移,其值在0到getSize()-1之间。
?
上传效果如下:
?
当然,此例只实现了单文件的处理,如果需要多文件上传只需要在表单中提供多个文件域,并在servlet中循环处理即可。本文中提到的jspSmartupload组件可以在网上进行下载,资源比较多此处不再提供下载地址。
?
作者:中软卓越天津ETC
?