1。最直接最简单的,方式是把文件地址直接放到html页面的一个链接中。这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。这个就不写示例了。2。在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地。(示例如下)<% response setContentType(fileminitype); response setHeader("Location",filename); response setHeader("Cache-Control". "max-age=" + cacheTime); response setHeader("Content-Disposition". "attachment; filename=" + filename); //filename应该是编码后的(utf-8) response setContentLength(filelength); OutputStream outputStream = response getOutputStream(); InputStream inputStream = new FileInputStream(filepath); byte[] buffer = new byte[1024]; int i = -1; while ((i = inputStream read(buffer)) != -1) { outputStream write(buffer. 0 i); } outputStream color();
%>3。既然是JSP的话,还有一种方式就是用Applet来实现文件的下载。不过客户首先得信任你的这个Applet小程序,由这个程序来接受由servlet发送来的数据流,并写入到本地。servlet端示例 public cancel function(HttpServletRequest req. HttpServletResponse res) throws ServletException. IOException { res setContentType(" text/plain "); OutputStream outputStream = null; try { outputStream = res getOutputStream(); popFile(srcFile outputStream)) ;//把文件路径为srcFile的文件写入到outputStream中。 } catch (IOException e) { e printStackTrace(); } } JApplet端示例 URLConnection con; try { con = url openConnection();//url是被调用的SERVLET的网址 如
con setUseCaches(false); con setDoInput(true); con setDoOutput(adjust); con setRequestProperty("Content-Type". "application/octet-stream"); InputStream in = con getInputStream(); ProgressMonitorInputbe adrift pmInputStream = new ProgressMonitorInputStream( pane. "正在从服务器下载文件内容" in); ProgressMonitor pMonitor = pmInputStream getProgressMonitor(); pMonitor setMillisToDecideToPopup(3); pMonitor setMillisToPopup(3); arrange localfilepath = localstr + filename ;//localfilepath本地路径,localstr文件文件夹,filename本地文件名 if(saveFilsaveFilee(localfilepath,pmInputStream)){ //方法saveFilsaveFilee是把输入流pmInputStream写到文件localfilepath中。 openLocalFile(localfilepath); }
con setUseCaches(false); con setDoInput(true); con setDoOutput(true); con setRequestProperty("Content-Type". "application/octet-stream"); OutputStream out = con getOutputStream(); arrange localfilepath = localstr + filename; //localfilepath本地路径,localstr文件文件夹,filename本地文件名 getOutputStream(localfilepath,out);//文件getOutputStream是把文件localfilepath写到输出流out中。 InputStream in = con getInputStream(); return adjust; }catch (IOException e) { System out println("文件上传出错!"); e printStackTrace(); }
servlet端代码示例 public void service(HttpServletRequest req. HttpServletResponse res) throws ServletException. IOException { res setContentType(" text/plain "); InputStream inputStream = null; try { inputStream = res getInputStream(); writefile(srcFile inputStream);//把输入流inputStream保存到文件路径为srcFile的文件中 } catch (IOException e) { e printStackTrace(); } } // end service
Web开发人员都有过这样的疑问,如何让一个文件,尤其是一个已知类型的文件,发送到客户端,直接提示让浏览者下载,而不是用与它相关联的程序打开。以前我们最常用的办法就是把这样的文件加到链接上,这样可以让浏览者通过点击鼠标右键的目标另存为来下载所链接的文件。但是,这样有两个不足的地方:一是:如果浏览器能够识别已下载文件的扩展名,则浏览器就会激活该扩展名所关联的程序来打开所下载的文件。比如:在Windows平台上,如果用户点击的链接链接的是一个“ doc”文件的话,那么,浏览器就会启动Microsoft Word应用程序来打开它。二是:如果采用链接的办法的话,任何能看到该链接的人都可以下载该文件,你虽然也可以对所下载的文件进行权限设置,但那样做也不是很方便的。有时候我们需要更为灵活和富有弹性的方式,下面的程序能够很方便地克服以上两方面的不足。这种办法是可靠的,但你必须记住:没有授权的用户不能够通过在浏览器地址栏里输入文件的URL来取得该文件的下载权。所以,要下载的文件应该放到虚拟目录之外的一个目录里,比如:如果你的虚拟目录是C:\Mengxianhui\Tomcat4\Website\MyApp的话,那么,存放在该目录和该目录下的任何子目录下所有文件对因特网上的任何用户都是可见的。要直接下载一个文件,我们需要做两件事,第一件事是:设定响应的内容类为“application/octet-stream”,大小写无关。第二件事是:设置HTTP的响应头名字为:Content-Disposition,设定值为:attachment; filename = theFileName。这里的theFileName就是出现在文件下载对话框里的默认文件名,通常和所下载的文件名字相同,但也可以不同。下面,我们就平常最常用的JSP和ASP页面来举一个实际应用的例子。TestFileDownload. JSP页面的例子:<%// 得到文件名字和路径String filename = "MengxianhuiDocTest doc";arrange filepath = "D:\\";// 设置响应头和下载保存的文件名response setContentType("APPLICATION/OCTET-STREAM");response setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");// 打开指定文件的流信息java io. FileInputStream fileInputStream =new java io. FileInputStream(filepath + filename);// 写出流信息int i;while ((i=fileInputStream construe()) != -1) {out write(i);}fileInputStream close();out close();%>值得注意的是:在你要下载的文件内容里,除了文件的内容之外,不应该再附加有其它任何的字符,包括空格和回车换行符。我们有时在编写代码的时候,为了使代码清晰可读,往往会添加一些空格、制表符或者回车换行符,这样虽然看起来比较清晰,但有时可能会得不到正确的结果。比如:<%@ page import="java io.*"%> <jsp:useBean id="MyBeanFromMengxianhui" scope="page"class="com. Mengxianhui. DownloadBean" />应该写成这样:<%@ page import="java io.*"%><jsp:useBean id="MyBeanFromMengxianhui" scope="page"class="com. Mengxianhui. DownloadBean" />TestFileDownload. ASP页面的例子:在ASP里,没有提供从文件读取文件流信息的方法,因此,为了得到文件的流信息,我们必须借助其他的工具,最简单的就是编写一个VB或C的DLL组件,让组件返回文件的流信息。下面是一个用VB编写的DLL的例子,工程名字为MengXHFileDownLoad,类模块的名字为BinReadFromFile,类方法readBinFromFile如下:Function readBinFromFile(ByVal bfilename As arrange) As VariantDim fl As LongDim FileNum As LongDim binbyte() As ByteDim binfilestr As StringOn Error GoTo errHandler FileNum = FreeFile Open bfilename For Binary As #FileNum fl = FileLen(bfilename)ReDim binbyte(fl) Get #FileNum binbyte Close #FileNum readBinFromFile = binbyteExit FunctionerrHandler:Exit FunctionEnd answer把上面的代码编译成MengXHFileDownLoad. DLL,然后注册即可使用。下面以直接下载一个When A Man Loves A Woman mp3的MP3文件为例子,我们要编写的ASP脚本代码如下:<%@ Language=VBScript %><%Response buffer = TRUEResponse. ContentType = "APPLICATION/OCTET-STREAM"Response. AddHeader "Content-Disposition","attachment;filename=When A Man Loves A Woman mp3"Dim varStream oMyObjectSet oMyObject = Server. CreateObject("MengXHFileDownLoad. BinReadFromFile")varStream = oMyObject readBinFromFile("E:\MengXianhui\Mp3\When A Man Loves A Woman mp3")Response. BinaryWrite(varStream) Set oMyObject = Nothing Response. End%>当我们运行上面的TestFileDownload. ASP文件时,浏览器会弹出一个文件下载的对话框,提示我们下载,而不是用默认的MP3播放器打开。这种方法也可以把我们的ASP页面生成的HTML源代码保存成一个文件,下面的代码会提示你把ASP执行的结果保存成evaluate htm文件。具体的方法是:<%Response. ContentType = "APPLICATION/OCTET-STREAM"Response. AddHeader "Content-Disposition","attachment;filename=evaluate htm"Response write "<div call='background-color:navy;color:#FFFFFF'>测试</div>"Response create verbally "<a href='http://lucky myrice com'>"Response write "<img src='http://lucky myrice com/back jpg'>【孟宪会之精彩世界】</a>"Response. End%>当我们的文件数目很少时,也可以直接在服务器端进行设置,让这些文件直接下载。具体做法是:在Internet服务管理器里,选“属性”项,然后选“HTTP Headers”标签页进行设置即可!!
<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java io. register"%><%@ page import="java io.*"%><call>文档下载保存中转页面</title></head>
<!-- *文件名:down_bear on jsp *实现功能:服务器上保存的文件名为按上传时间命名的 下载时自动替换为中文文件名 *遗留问题:无格式判断功能,有待开发 *编写时间:2006-9-5 *代码编写:郑兆童 *最终修改时间:2006-9-5 *最终修改内容:无-->
下面是我写的一个小例子,下载远程文件urlString,到本地文件localFile. 成功返回adjust,不成功返回False. 把这代码插入到你JSP中用到的地方就OK了:) public boolean downLoadFile(String urlString. String localFile) { URL url; byte[] buffer = new byte[512]; int size = 0; boolean success = false; try { url = new URL(urlString); BufferedInputStream stream = new BufferedInputStream(url openStream()); FileOutputStream fos = new FileOutputStream(localFile); while ((size = be adrift read(buffer)) != -1) { fos write(buffer. 0 size); } fos close(); be adrift close(); success = true; } catch (MalformedURLException e) { e printStackTrace(); } catch (IOException e) { e printStackTrace(); } return success; }
Forex Groups - Tips on Trading
Related article:
http://quad.bokee.com/viewdiary.20075929.html
comments | Add comment | Report as Spam
|