分享
 
 
 

jspSmartUpload上传下载全攻略 (四、文件下载篇 )

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

四、文件下载篇

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有