打印本文 打印本文  关闭窗口 关闭窗口
jspSmartUpload上传下载全攻略
作者:采集员 文章来源:来源于网络 点击数: 更新时间:2005/9/10 14:26:32
leSize(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+"个文件上传成功!<br>"); // 利用Request对象获取参数之值 out.println("TEST="+su.getRequest().getParameter("TEST") +"<BR><BR>"); // 逐一提取上传文件信息,同时可保存文件。 for (int i=0;i<su.getFiles().getCount();i++) { com.jspsmart.upload.File file = su.getFiles().getFile(i); // 若文件不存在则继续 if (file.isMissing()) continue; // 显示当前文件信息 out.println("<TABLE BORDER=1>"); out.println("<TR><TD>表单项名(FieldName)</TD><TD>" + file.getFieldName() + "</TD></TR>"); out.println("<TR><TD>文件长度(Size)</TD><TD>" + file.getSize() + "</TD></TR>"); out.println("<TR><TD>文件名(FileName)</TD><TD>" + file.getFileName() + "</TD></TR>"); out.println("<TR><TD>文件扩展名(FileExt)</TD><TD>" + file.getFileExt() + "</TD></TR>"); out.println("<TR><TD>文件全名(FilePathName)</TD><TD>" + file.getFilePathName() + "</TD></TR>"); out.println("</TABLE><BR>"); // 将文件另存 // 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.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();		// 初始化	su.initialize(pageContext);		// 设定contentDisposition为null以禁止浏览器自动打开文件,		//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为		//doc时,浏览器将自动用word打开它。扩展名为pdf时,		//浏览器将用acrobat打开。	su.setContentDisposition(null);		// 下载文件	su.downloadFile("/upload/如何赚取我的第一桶金.doc");%>


注意,执行下载的页面,在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("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程序开发过程中经常使用的上传下载组件,它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。

上一页  [1] [2] 



打印本文 打印本文  关闭窗口 关闭窗口