项目开发技巧(四):使用JspSmartupload实现文件上传下载(三):jspsmartupload samples

上个星期由于在项目中需要实现文件的上传和下载功能,于是开始动手搜集jspSmartUpload的相关资料,现将自己在项目中的一点感想和搜集的资料整理一下写成此文章,希望能够对有需要的人带来一些帮助。

     jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。但由于jspSmartUpload开发出来的时间比较早,它的官方网站已经关闭了。



    jspSmartUpload组件的压缩包是jspSmartUpload.zip,用WinZip或WinRAR将其解压到Tomcat的 webapps目录下,解压后,将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF,这样一改 jspSmartUpload类才能使用。因为Tomcat对文件名大小写敏感,它要求Web应用程序相关的类所在目录为WEB-INF,且必须是大写。 接着重新启动Tomcat,这样就可以在JSP文件中使用jspSmartUpload组件了。

      注意,按上述方法安装后,只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件,如果想让Tomcat服务器的所有Web应用程序都能用它,必须做如下工作:
1.进入命令行状态,将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。
2.运行JAR打包命令:jar cvf jspSmartUpload.jar com
(也可以打开资源管理器,切换到当前目录,用WinZip将com目录下的所有文件压缩成jspSmartUpload.zip,然后将jspSmartUpload.zip换名为jspSmartUpload.jar文件即可。)
3.将jspSmartUpload.jar拷贝到Tomcat的shared/lib目录下。


使用jspSmartUpload对表单的要求有以下限制:

1. METHOD应用POST,2. 即METHOD="POST"。

3. 增加属性:ENCTYPE="multipart/form-data"。例如:

FORM METHOD="POST" ENCTYPE="multipart/form-data"

ACTION="/jspSmartUpload/upload.jsp">

<INPUT TYPE="FILE" NAME="MYFILE">

<INPUT TYPE="SUBMIT">

</FORM>


文件的上传实现例子:

1. 上传页面:upload.htm

页面源代码:

<!-upload.htm----->

<!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>&nbsp;</p>

<p align="center">上传文件选择</p>

<FORM METHOD="POST" ACTION="jsp/do_upload.jsp"

ENCTYPE="multipart/form-data">

<input type="hidden" name="TEST" value="ok">

<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. 上传处理页面:upload.jsp

页面源代码:

<!---upload.jsp------>

<%@ page contentType=”text/html; charset=utf-8” language=”java” %>

<%@ page import=”java.util.* ,

com.jspSmartUpload.upload.*” %>


<html>

<head>

<title>上传文件!<title>

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8” >

</head>


<body>

<%

//创建一个JspSmartUpload对象

JspSmartUpload smartUpload = new JspSmartUpload();

//初始化,必须第一步执行

smartUpload.initialize(pageContext);


//限定上传文件的大小

smartUpload.setMaxFileSize(10000);


//设定允许上传的文件的总长度,用于限制一次性上传的数据量大小

smartUpload. setTotalMaxFileSize (20000);


//设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件

smartUpload.setAllowedFilesList(“doc , txt”);


//设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,jsp,htm,html扩展名的//文件和没有扩展名的文件

smartUpload.setDeniedFilesList(“exe , bat , jsp , htm , html”);


//将文件上传

smartUpload.upload();


//将文件上传的指定目录,先创建好文件目录

smartUpload.save(“/upload”);

out.prinln(“文件上传成功!”);


//从request中取得参数

out.println(“upload file” + smartUpload.getRequest().getParameter(“TEST”) + “<br>”);

//获取文件名.getFiles()方法取全部上传文件,以Files对象形式返回,可以利用Files

//类的操作方法来获得上传文件的数目等信息

String fileName = smartUpload.getFiels().getFile(0).getFileName();


// 将文件另存

// file.saveAs("/upload/" + myFile.getFileName());

// 另存到以WEB应用程序的根目录为文件根目录的目录下

// file.saveAs("/upload/" + myFile.getFileName() , su.SAVE_VIRTUAL);

// 另存到操作系统的根目录为文件根目录的目录下

// file.saveAs("c:/temp/" + myFile.getFileName() , su.SAVE_PHYSICAL);

%>

</body>

</html>


 

文件下载实现的例子;
1. 下载页面:download.htm

页面源代码:

<!--download.html-->

<!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>


3. 下载处理页面:download.jsp

页面源代码:

<%@ page contentType="text/html;charset=gb2312" import="com.jspsmart.upload.*" %>

<%

// 新建一个SmartUpload对象

SmartUpload su = new SmartUpload();

// 初始化,必须第一步执行

su.initialize(pageContext);


// 设定contentDisposition为null以禁止浏览器自动打开文件,

//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为

//doc时,浏览器将自动用word打开它。扩展名为pdf时,

//浏览器将用acrobat打开。

su.setContentDisposition(null);

// 下载文件

su.downloadFile("/upload/myfile.doc");

%>

注 意,执行下载的页面,在Java脚本范围外(即<% ... %>之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。不信的话,可以在上述源码中%><%之间加入一个 换行符,再下载一下,保证出错。因为它影响了返回给浏览器的数据流,导致解析出错。


saveAs方法的描述:

saveAs作用:将文件换名另存。

原型:
public void saveAs(java.lang.String destFilePathName)


public void saveAs(java.lang.String destFilePathName, int optionSaveAs)

其 中,destFilePathName是另存的文件名,optionSaveAs是另存的选项,该选项有三个值,分别是SAVEAS_PHYSICAL, SAVEAS_VIRTUAL,SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件, SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件,SAVEAS_AUTO则表示让组件决定,当Web应用程序的根目录存 在另存文件的目录时,它会选择SAVEAS_VIRTUAL,否则会选择SAVEAS_PHYSICAL。

例如,saveAs ("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文件名实际是c:.zip。而 saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用程序的根目录是 webapps/jspsmartupload,则另存的文件名实际是 webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip", SAVEAS_AUTO)执行时若Web应用程序根目录下存在upload目录,则其效果同saveAs("/upload/sample.zip", SAVEAS_VIRTUAL),否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。

建议:对于Web程序的开发来说,最好使用SAVEAS_VIRTUAL,以便移植。
z
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("File ''''" + s +
        "'''' not found (1040).");
    if(s.equals(""))
        throw new IllegalArgumentException("File ''''" + s +
        "'''' not found (1040).");
    if(!isVirtual(s) && m_denyPhysicalPath)
        throw new SecurityException("Physical path is
        denied (1035).");
    if(isVirtual(s))
        s = m_application.getRealPath(s);
    java.io.File file = new java.io.File(s);
    FileInputStream fileinputstream = new FileInputStream(file);
    long l = file.length();
    boolean flag = false;
    int k = 0;
    byte abyte0[] = new byte[i];
    if(s1 == null)
        m_response.setContentType("application/x-msdownload");
    else
    if(s1.length() == 0)
        m_response.setContentType("application/x-msdownload");
    else
        m_response.setContentType(s1);
    m_response.setContentLength((int)l);
    m_contentDisposition = m_contentDisposition != null ?
    m_contentDisposition : "attachment;";
    if(s2 == null)
        m_response.setHeader("Content-Disposition",
        m_contentDisposition + " filename=" +
        toUtf8String(getFileName(s)));
    else
    if(s2.length() == 0)
        m_response.setHeader("Content-Disposition",
        m_contentDisposition);
    else
        m_response.setHeader("Content-Disposition",
        m_contentDisposition + " filename=" + toUtf8String(s2));
    while((long)k < l)
    {
        int j = fileinputstream.read(abyte0, 0, i);
        k += j;
        m_response.getOutputStream().write(abyte0, 0, j);
    }
    fileinputstream.close();
    }

    /**
     * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
     * 纵横软件制作中心雨亦奇2003.08.01
     * @param s 原文件名
     * @return 重新编码后的文件名
     */
    public static String toUtf8String(String s) {
    StringBuffer sb = new StringBuffer();
    for (int i=0;i<s.length();i++) {
        char c = s.charAt(i);
        if (c >= 0 && c <= 255) {
        sb.append(c);
        } else {
        byte[] b;
        try {
            b = Character.toString(c).getBytes("utf-8");
        } catch (Exception ex) {
            System.out.println(ex);
            b = new byte[0];
        }
        for (int j = 0; j < b.length; j++) {
            int k = b[j];
            if (k < 0) k += 256;
            sb.append("%" + Integer.toHexString(k).
            toUpperCase());
        }
        }
    }
    return sb.toString();
    }
 


注 意源码中粗体部分,原jspSmartUpload组件对返回的文件未作任何处理,现在做了编码的转换工作,将文件名转换为UTF-8形式的编码形式。 UTF-8编码对英文未作任何处理,对中文则需要转换为%XX的形式。toUtf8String方法中,直接利用Java语言提供的编码转换方法获得汉字 字符的UTF-8编码,之后将其转换为%XX的形式。

将源码编译后打包成jspSmartUpload.jar,拷贝到Tomcat 的shared/lib目录下(可为所有WEB应用程序所共享),然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另, toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接。

小结:jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件,它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值