使用IE下载文件时,如果文件名过长,则文件名会被载断。具体表现为使用UTF-8编码时,不能超过17个汉字,有网友使用ISO-8859-1编码,但也只能支持153个个字符,并没有从根本上解决这个问题,比较好的解决方案是自己编写ActiveX控件,在本地保存时使用长文件名。但是需要对VB或者C++比较悉,正好我两者都不太熟,于是,我谷歌 一下,当然一下是谷不出来的,我至少谷了N次,终于找到一个免费的ActiveX下载控件,名曰:downloadXPro,好吧,下面我们看看这个控件都有哪些功能吧。
1、DownloadXPro是一个ActiveX控件;(我承认这是一句废话)
2、可以使用VB.NET,C#,C+ +,VB,Delphi中,ASP,ASP.NET,PHP,JAVA这些语言进行编程,也就是提供了API接口撒,说白了就是COM组件,至于各种语言怎么调用DownloadXPro,作为JAVA程序员,我没法给大家一个交待;
3、DownloadXPro从Internet下载文件(这是必须的),支持所有的网络协议(HTTP, HTTPS, FTP and Secure FTP/FTPS和代理服务器);
4、为了提高下载速度,将文件分了若干段,并且使用单独的线程;
5、支持断点继传(这个功能我还没用过,不做任何的保证);
6、控件可以到我的空间下载;
7、没了......
功能介绍完了,接下来看看实际的例子,免得被网友们说成纸上谈兵。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="webwork" prefix="ww"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>下载文件</title> <script type="text/javascript" src='<ww:url value="/Highcharts2.1/jquery-1.4.2.min.js"/>'></script> <script type="text/javascript" language="javascript"> function download() { //实例化控件 var dwX = new ActiveXObject("DownloadXPro.DownloadX.1.6"); //临时SESSION DownloadX.DownloadSessionTempSubfolder = "session-4639E7BD-47A7-4303-A522-759EA100A4CF"; //取出参数 var params=getUrlParam(window.location.href); //取出IP地址 var ip=getUrlIPAndPort(window.location.href); //文件名 var fileName=params["fileName1"]; //下载时显示的文件名 var code=params["code"]; //解码 code=decodeURIComponent(code); var json={ id:params['id'], fileName1:params['fileName1'] }; //从FTP服务器下载文件到应用服务器目录 $(function(){ $.post(params['contextPath']+"/core/upload/downloadfile.action",json,function(){ }); }); var nFileId = DownloadX.AddFile("http://"+ip+params['contextPath']+"/uploads/item/"+fileName, "-1", code, "\\"+code, 1, "", "", "", 0); //下载文件 var b=DownloadX.Download(); //文件没有被下载,则关闭下载窗口 if(b==false) { window.close(); } } /** * 得到URL参数 * * @param {} * name URL * @return {} 参数 */ function getUrlParam(name) { var urlParamsArray = {}; var index = name.indexOf("?"); if (index == -1) { return undefined; } else { var urlRight = name.substring(index + 1, name.length); var arrayParams = urlRight.split("&"); for (var i = 0; i < arrayParams.length; i++) { var arrayParam = arrayParams[i].split("="); urlParamsArray[arrayParam[0]] = arrayParam[1]; } } return urlParamsArray; } /** * 得到IP地址 **/ function getUrlIPAndPort(name) { if(name!=undefined) { var url=name.split("/"); if(url!=undefined) return url[2]; else return null; }else { return null; } } </script> </head> <body οnlοad="download()"> <object id="DownloadX" width="600" height="400" classid="clsid:D1A7314E-03BD-40e0-BA6A-F37AB575FECF" codebase="DownloadXPro.cab#Version=1,6,5,0"> </object> <script type="text/javascript" language="javascript"> //文件下载完毕时,关闭窗口 function DownloadX::OnDownloadComplete(result) { alert("文件下载完成"); window.close(); } </script> </body> </html>