js下载文件的实现方法一

合集下载

JavaScript实现的浏览器下载文件的方法

JavaScript实现的浏览器下载文件的方法
浏览器缓存的意义在于提高了执行效率但是也随之而来带来了一些问题导致服务端修改了jscss客户端不能更新下面有几个不错的方法可以解决此问题感兴趣的朋友可以参考下
JavaScript实 现 的 浏 览 器 下 载 文 件 的 方 法
废话不多说了,直接给大家贴代码了,具体代码如下所示:
function download(src) { var $a = document.createElement('a'); $a.setAttribute("href", src); $a.setAttribute("download", ""); var evObj = document.createEvent('MouseEvents'); evObj.initMouseEvent( 'click', true, true, window, 0, 0, 0, 0, 0, false, false, true, false, 0, null); $a.dispatchEvent(evObj);
};
该方法从网上找来的,直接调用,使用直接传路径,就可使用
总结
以上所述是小Biblioteka 给大家介绍的JavaScript实现的浏览器下载文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留 言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

jsp下载文件的实现方法 及 注意

jsp下载文件的实现方法 及 注意
response.setContentType("application/force-download");//设置为下载application/force-download
这样,就可以保证在用户点击下载链接的时候浏览器一定会弹出提示窗口来询问你是下载还是直接打开并允许你选择要打开的应用程序,除非你设置了浏览器的一些默认行为。
//application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径
String filedownload = "想办法找到要提供下载的文件的物理路径+文件名";
String filedisplay = "给用户提供的下载文件名";
{
in.close();
in = null;
}
//这里不能关闭
//if(outp != null)
//{
//outp.close();
//outp = null;
//}
}
%>
对于第二种方法,我认为应该是比较常用的。不过有几个地方是值得我们注意的:
java.io.OutputStream outp = null;
java.io.FileInputStream in = null;
try
{
outp = response.getOutputStream();
in = new FileInputStream(filenamedownload);
{
in.close();
in = null;
}
//这里不能关闭

用Jsp来实现文件下载功能的几种方式

用Jsp来实现文件下载功能的几种方式

1.最直接最简单的,方式是把文件地址直接放到html页面的一个链接中。

这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。

这个就不写示例了。

2.在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地。

(示例如下)
3.既然是JSP的话,还有一种方式就是用Applet来实现文件的下载。

不过客户首先得信任你的这个Applet小程序,由这个程序来接受由servlet发送来的数据流,并写入到本地。

servlet端示例
JApplet端示例
4.顺便把JApplet上传文件的代码也贴上来. JApplet端示例
servlet端代码示例
总结:在文件的传输中是流的形式存在的,在硬盘上是文件的形式存在的。

我们要做的只是通过HttpServletRequest和HttpServletResponse,或者是response和request来发送流和读取流。

以及把文件转换成流或把流转换成文件的操作。

使用JS代码实现点击按钮下载文件

使用JS代码实现点击按钮下载文件

使⽤JS代码实现点击按钮下载⽂件有时候我们在⽹页上需要增加⼀个下载按钮,让⽤户能够点击后下载页⾯上的资料,那么怎样才能实现功能呢?这⾥有两种⽅法:现在需要在页⾯上添加⼀个下载按钮,点击按钮下载⽂件。

题外话,这个下载图标是引⽤的 font-awesome 上⾯的。

使⽤时,⾸先将 font-awesome 整个⽂件夹下载下来,利⽤bower或者是⾃⼰去官⽹上⾯下载都⾏。

将整个⽂件夹放在项⽬⽂件中之后,在页⾯上⾯引⼊css⽂件1<link href="libs/font-awesome-4.7.0/css/font-awesome.min.css"type="text/css"rel="stylesheet">在页⾯上可以开始使⽤所需要的图标了1<i class="fa fa-download"aria-hidden="true"title="下载"></i>1.下载项⽬中的⽂件如果要下载的是⼀个excel⽂件模板,可以先将该⽂件放在项⽬⽂件夹下⾯,然后在页⾯下载按钮上加上onclick事件:1<i class="fa fa-download"aria-hidden="true"title="下载"onclick="window.open('file/user.xlsx')"></i>这样在点击图标之后,⽂件就会⾃动下载了。

2.发送请求地址下载⽂件JQuery的ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使⽤相应的ajax函数进⾏⽂件下载。

但可以⽤js⽣成⼀个form,⽤这个form提交参数,并返回“流”类型的数据。

浅析Node.js实现HTTP文件下载

浅析Node.js实现HTTP文件下载

浅析Node.js实现HTTP⽂件下载前⾔HTTP实现⽂件下载时,只要在服务器设置好相关响应头,并使⽤⼆进制传输⽂件数据即可,⽽客户端(浏览器)会根据响应头接收⽂件数据。

⽽在Node.js中,设置好响应头后,读取⽂件流,再使⽤“.pipe()”⽅法将流转接到响应对象Response就可以实现⼀个简单的⽂件下载服务器。

1. ⽂件下载介绍HTTP基于请求头和响应头实现状态交互,在得到服务器正确响应状态后,⽽客户端⾸先会解析响应头,并根据响应头来接收和展⽰数据(响应体)。

对于⽂件下载来说,其实现过程如下:1.客户端发起⽂件资源请求2.服务器查找对应⽂件,并设置”Content-Type”、”Content-Disposition”等响应头,分别⽤于表⽰⽂件的”MIME”类型及⽂件描述3.客户端根据服务器返回的响应头解析和接收⽂件数据需要设置的响应头设置⽂件下载响应头时,除了常⽤的HTTP响应头外,⽐较重要是还要设置以下两个响应头:Content-Type: application/octet-streamContent-Disposition: attachment; filename=MyFileName.ext在上⾯的设置中,”Content-Type: application/octet-stream”告诉浏览器这是⼀个⼆进制⽂件,”Content-Disposition”告诉浏览器这是⼀个需要下载的附件并告诉浏览器默认的⽂件名。

如果不添加”Content-Disposition”响应头,浏览器可能会下载或显⽰⽂件内容,不同浏览器的处理有所不同。

2. Node.js⽂件下载服务器实现接下来我们基于Express 框架实现⼀个简单⽂件下载服务器,在这个服务器中主要包括两个功能:服务器⽂件的浏览、⽂件的下载。

2.1 添加路由创建Express应⽤后,添加如下两个路由:router.get('/files', function(req, res, next) {// 显⽰服务器⽂件});router.get('/file/:fileName', function(req, res, next) {// 实现⽂件下载});上⾯的添加的两个路由分别⽤于:显⽰服务器⽂件、实现⽂件下载。

js下载文件的实现方法一

js下载文件的实现方法一

js下载文件的实现方法一f8bjs下载文件的实现方法及注意js中实现文件下载(一)最简单的方式是在页上做超级链接如:&lt;a href=&quot;music/abc.m3&quot;&gt;下载&lt;/a&gt;。

但是这样服务器上的目录资源会直接暴露给最终用户会给站带来一些不安全的因素。

因此可以采用其它方式实现下载可以采用:1、RequestDisatcher的方式进行;2、采用文件流输出的方式下载。

(推荐)1、采用RequestDisatcher的方式进行Js代码&lt;%resonse.setContentTye(&quot;alication/x-download&quot;);//设置为下载alication/x-downloadString filedownload = &quot;/要下载的文件名&quot;;//即将下载的文件的相对径String filedislay = &quot;最终要显示给用户的保存文件名&quot;;//下载文件时显示的文件保存名称String filenamedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);try{RequestDisatcher dis = alication.getRequestDisatcher(filedownload);if(dis!= null){dis.forward(request,resonse);}resonse.flushBuffer();}catch(Excetion e){e.rintStackTrace();}finally{}%&gt;&lt;%resonse.setContentTye(&quot;alication/x-download&quot;);//设置为下载alication/x-downloadString filedownload = &quot;/要下载的文件名&quot;;//即将下载的文件的相对径String filedislay = &quot;最终要显示给用户的保存文件名&quot;;//下载文件时显示的文件保存名称String filenamedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);try{RequestDisatcher dis = alication.getRequestDisatcher(filedownload);if(dis!= null){dis.forward(request,resonse);}resonse.flushBuffer();}catch(Excetion e){e.rintStackTrace();}finally{}%&gt;2、采用文件流输出的方式下载Js代码&lt;%age language=&quot;java&quot; contentTye=&quot;alication/x-msdownload&quot;ageEncoding=&quot;gb2312&quot;%&gt;&lt;%//关于文件下载时采用文件流输出的方式处理://加上resonse.reset()并且所有的%&gt;后面不要换行包括最后一个;resonse.reset();//可以加也可以不加resonse.setContentTye(&quot;alication/x-download&quot;);//alication.getRealath(&quot;/main/mvlayer/CaSetu.msi&quot;);获取的物理径String filedownload = &quot;想办法找到要提下载的文件的物理径+文件名&quot;;String filedislay = &quot;给用户提的下载文件名&quot;;String filedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);java.io.OututStream out =null;java.io.FileInutStream in = null;try{out = resonse.getOututStream();in = new FileInutStream(filenamedownload);byte[] b = new byte[1024];int i = 0;while((i = in.read(b)) &gt; 0)out.write(b, 0, i);}//out.flush();//要加以下两句话否则会报错//ng.IllegalStateExcetion: getOututStream() has already been called for //this resonseout.clear();out = hBody();}catch(Excetion e){System.out.rintln(&quot;Error!&quot;);e.rintStackTrace();}finally{if(in != null){in.close();in = null;//这里不能关闭//if(out != null)//{//out.close();//out = null;//}}%&gt;&lt;%age language=&quot;java&quot; contentTye=&quot;alication/x-msdownload&quot;ageEncoding=&quot;gb2312&quot;%&gt;&lt;%//关于文件下载时采用文件流输出的方式处理://加上resonse.reset()并且所有的%&gt;后面不要换行包括最后一个;resonse.reset();//可以加也可以不加resonse.setContentTye(&quot;alication/x-download&quot;);//alication.getRealath(&quot;/main/mvlayer/CaSetu.msi&quot;);获取的物理径String filedownload = &quot;想办法找到要提下载的文件的物理径+文件名&quot;;String fifc1ledislay = &quot;给用户提的下载文件名&quot;;String filedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);java.io.OututStream out = null;java.io.FileInutStream in = null;try{out = resonse.getOututStream();in = new FileInutStream(filenamedownload);byte[] b = new byte[1024];int i = 0;while((i = in.read(b)) &gt; 0){out.write(b, 0, i);}//out.flush();//要加以下两句话否则会报错//ng.IllegalStateExcetion: getOututStream() has already been called for //this resonseout.clear();out = hBody();}catch(Excetion e){System.out.rintln(&quot;Error!&quot;);e.rintStackTrace();}finally{if(in != null){in.close();in = null;}//这里不能关闭//if(out != null)//{//out.close();//out = null;//}}%&gt;对于第二种方法我认为应该是比较常用的。

JS下载文件,解决文件直接在浏览器打开的情况

JS下载文件,解决文件直接在浏览器打开的情况

JS下载⽂件,解决⽂件直接在浏览器打开的情况JS下载⽂件,解决⽂件直接在浏览器打开的情况:function downloadfile(url, file_name) {var xmlHttp = null;if (window.ActiveXObject) {// IE6, IE5 浏览器执⾏代码xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");} else if (window.XMLHttpRequest) {// IE7+, Firefox, Chrome, Opera, Safari 浏览器执⾏代码xmlHttp = new XMLHttpRequest();}//2.如果实例化成功,就调⽤open()⽅法:if (xmlHttp != null) {xmlHttp.open("get", url, true);xmlHttp.send();xmlHttp.onreadystatechange = doResult; //设置回调函数}function doResult() {if (xmlHttp.readyState == 4) { //4表⽰执⾏完成if (xmlHttp.status == 200) { //200表⽰执⾏成功//引⽤js库:download.jsdownload(xmlHttp.responseText, file_name, "text/plain");}}}}download.js://download.js v3.0, by dandavis; 2008-2014. [CCBY2] see /download.html for tests/usage// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support// data can be a string, Blob, File, or dataURLfunction download(data, strFileName, strMimeType) {var self = window, // this script is only for browsers anyway...u = "application/octet-stream", // this default mime also triggers iframe downloadsm = strMimeType || u,x = data,D = document,a = D.createElement("a"),z = function(a){return String(a);},B = self.Blob || self.MozBlob || self.WebKitBlob || z,BB = self.MSBlobBuilder || self.WebKitBlobBuilder || self.BlobBuilder,fn = strFileName || "download",blob,b,ua,fr;//if(typeof B.bind === 'function' ){ B=B.bind(self); }if(String(this)==="true"){ //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callbackx=[x, m];m=x[0];x=x[1];}//go ahead and download dataURLs right awayif(String(x).match(/^data\:[\w+\-]+\/[\w+\-]+[,;]/)){return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:navigator.msSaveBlob(d2b(x), fn) :saver(x) ; // everyone else can save dataURLs un-processed}//end if dataURL passed?try{blob = x instanceof B ?x :new B([x], {type: m}) ;}catch(y){if(BB){b = new BB();b.append([x]);blob = b.getBlob(m); // the blob}}function d2b(u) {var p= u.split(/[:;,]/),t= p[1],dec= p[2] == "base64" ? atob : decodeURIComponent,bin= dec(p.pop()),mx= bin.length,i= 0,uia= new Uint8Array(mx);for(i;i<mx;++i) uia[i]= bin.charCodeAt(i);return new B([uia], {type: t});}function saver(url, winMode){if ('download' in a) { //html5 A[download]a.href = url;a.setAttribute("download", fn);a.innerHTML = "downloading...";D.body.appendChild(a);setTimeout(function() {a.click();D.body.removeChild(a);if(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(a.href);}, 250 );} }, 66);return true;}//do iframe dataURL download (old ch+FF):var f = D.createElement("iframe");D.body.appendChild(f);if(!winMode){ // force a mime that will download:url="data:"+url.replace(/^data:([\w\/\-\+]+)/, u);}f.src = url;setTimeout(function(){ D.body.removeChild(f); }, 333);}//end saverif (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)return navigator.msSaveBlob(blob, fn);}if(self.URL){ // simple fast and modern way using Blob and URL:saver(self.URL.createObjectURL(blob), true);}else{// handle non-Blob()+non-URL browsers:if(typeof blob === "string" || blob.constructor===z ){try{return saver( "data:" + m + ";base64," + self.btoa(blob) );}catch(y){return saver( "data:" + m + "," + encodeURIComponent(blob) );}// Blob but not URL:fr=new FileReader();fr.onload=function(e){ saver(this.result);};fr.readAsDataURL(blob); }return true;} /* end download() */。

前端调用后台接口下载word文档的两种方法

前端调用后台接口下载word文档的两种方法

前端调⽤后台接⼝下载word⽂档的两种⽅法1传统的ajax虽然能提交到后台,但是返回的数据被解析成json,html,text等字符串,⽆法响应浏览器下载。

就算使⽤bob模拟下载,数据量⼤时也不⽅便废话不多说:上代码(此处是Layui监听提交,传统的html提交更⽅便)//监听提交form.on('submit(formDemo)', function (data) {layer.msg(JSON.stringify(data.field));//第⼀种⽅式这种⽅式直接打开链接,参数后缀到后台查找,即可下载// window.open('/jump/download?id='+data.field.id, '_blank');//第⼆种⽅式这种⽅式模拟表单提交,动态获取值传⼊后台try {var queryForm = $('#llll');var exportForm = $("<form action=' /jump/download' method='post'></form>")queryForm.find("input").each(function() {var name = $(this).attr("name");var value = $(this).val();exportForm.append("<input type='hidden' name='" + name + "' value='" + value + "'/>")});queryForm.find("select").each(function() {var name = $(this).attr("name");var value = $(this).val();exportForm.append("<input type='hidden' name='" + name + "' value='" + value + "'/>")});$(document.body).append(exportForm);exportForm.submit();} catch (e) {console.log(e);} finally {exportForm.remove();}//3第三种ajax提交表单,不相应浏览器下载这种⽅式可以提交⼀个Map 去后台但是返回⽂件不容易下载,精通原⽣js的伙伴可以试试,⽐较⿇烦,再次我就不献丑了 // $.ajax({// type:"GET",// url:"/jump/download",// data:JSON.stringify(data.field),// contentType:"application/json;charset=UTF-8",// success:function (data) {//// }// });return false;//ajax 提交时Layui防⽌页⾯⾃动刷新});@ApiOperation(value = "导出word⽂档", notes = "{\"id\":\"11\"}")@RequestMapping(value = "/download",method = RequestMethod.POST)public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {//对应前端第三种提交⽅式 @RequestBody Map map 第⼀种⽅式⽀持前端提交过来⼀个MapMap<String, Object> userMapMeS = new HashMap<String, Object>();// String fileName=map.get("name").toString();// userMapMeS.put("name", map.get("name").toString());// userMapMeS.put("id", map.get("id").toString());// userMapMeS.put("age", map.get("age").toString());// userMapMeS.put("phone", map.get("phone").toString());// userMapMeS.put("password", map.get("password").toString());// userMapMeS.put("email", map.get("email").toString());// userMapMeS.put("times", map.get("times").toString());// userMapMeS.put("address", map.get("address").toString());// userMapMeS.put("sex", map.get("sex").toString());// userMapMeS.put("work", map.get("work").toString());// userMapMeS.put("hobby", map.get("hobby").toString());//对应第⼀种前端提交⽅式// String id=request.getParameter("id");// Map map=new HashMap();// map.put("id",id);// User user= userService.selectUser(map);// String fileName=user.getName();// Map<String, Object> userMapMeS = new HashMap<String, Object>();// userMapMeS.put("name", user.getName());// userMapMeS.put("id", user.getId());// userMapMeS.put("age", user.getAge());// userMapMeS.put("phone", user.getPhone());// userMapMeS.put("password", user.getPassword());// userMapMeS.put("email", user.getEmail());// userMapMeS.put("times", user.getTimes());// userMapMeS.put("address", user.getAddress());// userMapMeS.put("sex", user.getSex());// userMapMeS.put("work", user.getWork());// userMapMeS.put("hobby", user.getHobby());//对应前端第⼆种前端模拟表单提交String fileName =request.getParameter("name").toString();userMapMeS.put("name", request.getParameter("name").toString());userMapMeS.put("id", request.getParameter("id").toString());userMapMeS.put("age", request.getParameter("age").toString());userMapMeS.put("phone", request.getParameter("phone").toString());userMapMeS.put("password", request.getParameter("password").toString());userMapMeS.put("email", request.getParameter("email").toString());userMapMeS.put("times", request.getParameter("times").toString());userMapMeS.put("address", request.getParameter("address").toString());userMapMeS.put("sex", request.getParameter("sex").toString());userMapMeS.put("work", request.getParameter("work").toString());userMapMeS.put("hobby", request.getParameter("hobby").toString());String endCodeFileName = new String(fileName.getBytes("utf-8"), "ISO8859-1");response.reset();//清除空⽩⾏纺织报错response.setHeader("Access-Control-Allow-Origin", "*");//所有域都可以跨response.setHeader("Content-Type", "application/octet-stream;charset=UTF-8");//⼆进制流⽂件response.setHeader("Content-Disposition", "attachment;filename=" + endCodeFileName+".doc");//下载及其⽂件名 response.setHeader("Connection", "close");//关闭请求头连接//设置⽂件在浏览器打开还是下载response.setContentType("application/x-download");WordUtil wUtil = new WordUtil();long now= System.currentTimeMillis();wUtil.createDoc(userMapMeS, response.getOutputStream());long end= System.currentTimeMillis();long ddd=end-now;System.out.println("ddd" + ddd);}⼯具类在下篇⽂章。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

js下载文件的实现方法一f8bjs下载文件的实现方法及注意js中实现文件下载(一)最简单的方式是在页上做超级链接如:&lt;a href=&quot;music/abc.m3&quot;&gt;下载&lt;/a&gt;。

但是这样服务器上的目录资源会直接暴露给最终用户会给站带来一些不安全的因素。

因此可以采用其它方式实现下载可以采用:1、RequestDisatcher的方式进行;2、采用文件流输出的方式下载。

(推荐)1、采用RequestDisatcher的方式进行Js代码&lt;%resonse.setContentTye(&quot;alication/x-download&quot;);//设置为下载alication/x-downloadString filedownload = &quot;/要下载的文件名&quot;;//即将下载的文件的相对径String filedislay = &quot;最终要显示给用户的保存文件名&quot;;//下载文件时显示的文件保存名称String filenamedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);try{RequestDisatcher dis = alication.getRequestDisatcher(filedownload);if(dis!= null){dis.forward(request,resonse);}resonse.flushBuffer();}catch(Excetion e){e.rintStackTrace();}finally{}%&gt;&lt;%resonse.setContentTye(&quot;alication/x-download&quot;);//设置为下载alication/x-downloadString filedownload = &quot;/要下载的文件名&quot;;//即将下载的文件的相对径String filedislay = &quot;最终要显示给用户的保存文件名&quot;;//下载文件时显示的文件保存名称String filenamedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);try{RequestDisatcher dis = alication.getRequestDisatcher(filedownload);if(dis!= null){dis.forward(request,resonse);}resonse.flushBuffer();}catch(Excetion e){e.rintStackTrace();}finally{}%&gt;2、采用文件流输出的方式下载Js代码&lt;%age language=&quot;java&quot; contentTye=&quot;alication/x-msdownload&quot;ageEncoding=&quot;gb2312&quot;%&gt;&lt;%//关于文件下载时采用文件流输出的方式处理://加上resonse.reset()并且所有的%&gt;后面不要换行包括最后一个;resonse.reset();//可以加也可以不加resonse.setContentTye(&quot;alication/x-download&quot;);//alication.getRealath(&quot;/main/mvlayer/CaSetu.msi&quot;);获取的物理径String filedownload = &quot;想办法找到要提下载的文件的物理径+文件名&quot;;String filedislay = &quot;给用户提的下载文件名&quot;;String filedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);java.io.OututStream out =null;java.io.FileInutStream in = null;try{out = resonse.getOututStream();in = new FileInutStream(filenamedownload);byte[] b = new byte[1024];int i = 0;while((i = in.read(b)) &gt; 0)out.write(b, 0, i);}//out.flush();//要加以下两句话否则会报错//ng.IllegalStateExcetion: getOututStream() has already been called for //this resonseout.clear();out = hBody();}catch(Excetion e){System.out.rintln(&quot;Error!&quot;);e.rintStackTrace();}finally{if(in != null){in.close();in = null;//这里不能关闭//if(out != null)//{//out.close();//out = null;//}}%&gt;&lt;%age language=&quot;java&quot; contentTye=&quot;alication/x-msdownload&quot;ageEncoding=&quot;gb2312&quot;%&gt;&lt;%//关于文件下载时采用文件流输出的方式处理://加上resonse.reset()并且所有的%&gt;后面不要换行包括最后一个;resonse.reset();//可以加也可以不加resonse.setContentTye(&quot;alication/x-download&quot;);//alication.getRealath(&quot;/main/mvlayer/CaSetu.msi&quot;);获取的物理径String filedownload = &quot;想办法找到要提下载的文件的物理径+文件名&quot;;String fifc1ledislay = &quot;给用户提的下载文件名&quot;;String filedislay = URLEncoder.encode(filedislay,&quot;UTF-8&quot;); resonse.addHeader(&quot;Content-Disosition&quot;,&quot;attachment;filena me=&quot; + filedislay);java.io.OututStream out = null;java.io.FileInutStream in = null;try{out = resonse.getOututStream();in = new FileInutStream(filenamedownload);byte[] b = new byte[1024];int i = 0;while((i = in.read(b)) &gt; 0){out.write(b, 0, i);}//out.flush();//要加以下两句话否则会报错//ng.IllegalStateExcetion: getOututStream() has already been called for //this resonseout.clear();out = hBody();}catch(Excetion e){System.out.rintln(&quot;Error!&quot;);e.rintStackTrace();}finally{if(in != null){in.close();in = null;}//这里不能关闭//if(out != null)//{//out.close();//out = null;//}}%&gt;对于第二种方法我认为应该是比较常用的。

不过有几个地方是值得我们注意的:一、采用第二种方法的主要优点是实际文件的存放径对客户端来说是透明的。

这个文件可以存在于任何你的服务器能够取得到的地方而客户端不一定能直接得到。

例如文件来自于数据库或者内部络的一个FT服务器。

还句话说这种方式可以实现隐藏实际文件的URL。

二、为了防止客户端浏览器直接打开目标文件(例如在装了MS Office套件的Windows中的IE浏览器可能就会直接在IE浏览器中打开你想下载的doc或者xls文件)你必须在响应头里加入强制下载的MIME类型:resonse.setContentTye(&quot;alication/force-download&quot;);//设置为下载alication/force-download这样就可以保证在用户下载链接的时候浏览器一定会弹出提示窗口来询问你是下载还是直接打开并允许你选择要打开的应用程序除非你设置了浏览器的一些默认行为。

相关文档
最新文档