做文件下载做了好久,一开始的是在项目目录下的上传下载,很容易实现,各种封装方法简单快捷,后来是转手ftp,用的FTPClient,也有点坎坷,最后又死在了Extjs上面,废话不多说,说说网上大家给的方法:
//1.链接形式
window.location.href='orderAttachDownload.action?filePath='+rec.get('filePath');
//直接用脚本跳转,后台请求通过struts返回inputStream+文件名,配置好附件类型,此处如果请求成功,则会弹出下载对话框
但是这种方法存在的问题在于,如果文件的路径是错的,则返回的inputstream为null,接而跳转的页面则是struts报错页面,对于错误的提示也不好控制
//2.网上流传的ajax请求的写法,此处仅仅适用于文件路径为项目路径(文件上传与下载都在tomcat部署的目录下,则可直接返回realPath进行下载)
Ext.Ajax.request({
url:'getPath.action',
success:function(res){
var obj = Ext.decode(res.responseText);
//console.log(obj);//可以到火狐的firebug下面看看obj里面的结构
//加入getPath返回的json为{'path':'upload/abc.jpg'}
window.location.href = obj.path;//这样就可以弹出下载对话框了
}
});
此种方法并不适用于返回文件流形式的下载,对于ftp的下载,无法直接返回一个路径,如果是直接缓存成temp文件,更没有必要了吧
if (!Ext.fly('downloadAttachFileForm')) {// 生成一个弹出对话框,以提供下载
var frm = document.createElement('form');
frm.id = 'downloadAttachFileForm';
frm.style.display = 'none';
document.body.appendChild(frm);
}
Ext.Ajax.request({// 请求附件下载
url : "orderAttachDownload.action",
isUpload : true,
form : Ext.fly('downloadAttachFileForm'),
method : 'POST',
params : {
filePath : rec.get('filePath')// 附件的路径
},
success : function(response) {// 文件不存在返回的json:{"success":"false","message":"文件不存在"}</code>
var result = Ext.decode(response.responseText);
if (result.success=='false') {
Ext.Msg.alert('提示',result.message);
}
}
小白一枚,如有不对的地方还望大家指教