站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题jspSmartUpload上传下载全攻略2

jspSmartUpload上传下载全攻略2

摘要: jspSmartUpload上传下载全攻略2


C.下载文件常用的方法

1、setContentDisposition

作用:将数据追加到MIME文件头的CONTENT-DISPOSITION域。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,请用此方法。

原型:public void setContentDisposition(String contentDisposition)

其中,contentDisposition为要添加的数据。如果contentDisposition为null,则组件将自动添加"attachment;",以表明将下载的文件作为附件,结果是IE浏览器将会提示另存文件,而不是自动打开这个文件(IE浏览器一般根据下载的文件扩展名决定执行什么操作,扩展名为doc的将用word程序打开,扩展名为pdf的将用acrobat程序打开,等等)。

2、downloadFile

作用:下载文件。

原型:共有以下三个原型可用,第一个最常用,后两个用于特殊情况下的文件下载(如更改内容类型,更改另存的文件名)。

① public void downloadFile(String sourceFilePathName)

其中,sourceFilePathName为要下载的文件名(带目录的文件全名)

② public void downloadFile(String sourceFilePathName,String contentType)

其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别)。

③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName)

其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别),destFileName为下载后默认的另存文件名。

三、文件上传篇

㈠ 表单要求

对于上传文件的FORM表单,有两个要求:

1、METHOD应用POST,即METHOD="POST"。

2、增加属性:ENCTYPE="multipart/form-data"

下面是一个用于上传文件的FORM表单的例子:

<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1> <tr> <td class=code bgColor=#e6e6e6>
<form METHOD="POST" ENCTYPE="multipart/form-data"

ACTION="/jspSmartUpload/upload.jsp">

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

<input TYPE="SUBMIT">

</form>
</td></tr></table>


㈡ 上传的例子

1、上传页面upload.html

本页面提供表单,让用户选择要上传的文件,点击"上传"按钮执行上传操作。

页面源码如下:

<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1> <tr> <td class=code bgColor=#e6e6e6>


    文件名:upload.html

作  者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com)

 HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">



<head>

文件上传



</head>

<body>

&nbsp;

上传文件选择

<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>
1、 <input type="FILE" name="FILE1" size="30">
</td> </tr> <tr> <td>
2、 <input type="FILE" name="FILE2" size="30">
</td> </tr> <tr> <td>
3、 <input type="FILE" name="FILE3" size="30">
</td> </tr> <tr> <td>
4、 <input type="FILE" name="FILE4" size="30">
</td> </tr> <tr> <td>
<input type="submit" name="Submit" value="上传它!">
</td> </tr> </table> </form> </body>
</td></tr></table>


2、上传处理页面do_upload.jsp

本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法,在此不赘述了。

页面源码如下:

<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1> <tr> <td class=code bgColor=#e6e6e6>
<%--

文件名:do_upload.jsp

作  者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com)

--%>

<%@ page contentType="text/html; charset=gb2312" language="java"

import="java.util.*,com.jspsmart.upload.*" errorPage="" %>



<head>

文件上传处理页面



</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");

// 4.设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,

jsp,htm,html扩展名的文件和没有扩展名的文件。

// su.setDeniedFilesList("exe,bat,jsp,htm,html,,");

// 上传文件

su.upload();

// 将上传文件全部保存到指定目录

int count = su.save("/upload");

out.println(count+"个文件上传成功!
"); // 利用Request对象获取参数之值 out.println("TEST="+su.getRequest().getParameter("TEST") +"

"); // 逐一提取上传文件信息,同时可保存文件。 for (int i=0;i"); // 将文件另存 // file.saveAs("/upload/" + myFile.getFileName()); // 另存到以WEB应用程序的根目录为文件根目录的目录下 // file.saveAs("/upload/" + myFile.getFileName(), su.SAVE_VIRTUAL); // 另存到操作系统的根目录为文件根目录的目录下 // file.saveAs("c:\\temp\\" + myFile.getFileName(), su.SAVE_PHYSICAL); } %> </body>
</td></tr></table>


四、文件下载篇

1、下载链接页面download.html

页面源码如下:

<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1> <tr> <td class=code bgColor=#e6e6e6>


文件名:download.html

作  者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com)

 HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">



<head>

下载



</head>

<body>

点击下载

</body>

</td></tr></table>


2、下载处理页面do_download.jsp do_download.jsp展示了如何利用jspSmartUpload组件来下载文件,从下面的源码中就可以看到,下载何其简单。

源码如下:

<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1> <tr> <td class=code bgColor=#e6e6e6>
<%@ 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/如何赚取我的第一桶金.doc");

%>
</td></tr></table>


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

3、如何下载中文文件

jspSmartUpload虽然能下载文件,但对中文支持不足。若下载的文件名中有汉字,则浏览器在提示另存的文件名时,显示的是一堆乱码,很扫人兴。上面的例子就是这样。(这个问题也是众多下载组件所存在的问题,很少有人解决,搜索不到相关资料,可叹!)

为了给jspSmartUpload组件增加下载中文文件的支持,我对该组件进行了研究,发现对返回给浏览器的另存文件名进行UTF-8编码后,浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理,增加了toUtf8String这个方法,改动部分源码如下:

<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1> <tr> <td class=code bgColor=#e6e6e6>
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= 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();

    }
</td></tr></table>


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

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

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

</td> </tr> <tr> <td vAlign=top align=left height="100%">
↑返回目录
前一篇: jspSmartUpload上传下载全攻略1
后一篇: Servlet、Jsp中的多国语言显示