前端页面代码(请求Action),fn_downLoad方法的参数fileName是传给Action的需要卸载文件的名字:// 下载文件方法
function fn_downLoad(fileName) {
Ext.Ajax.request({
url : "downLoadFile.action",
params : {
delFileName : fileName
},
method : "POST",
timeout : 4000,
success : function(response, opts) {
                                         // Action放回文件流对象在response对象里
                                         // 请问代码如何实现下载
 // var obj = Ext.decode(response.responseText);
 // window.location.href = obj.path;
}
});
}==============================================
后台Action代码/**
 * 
 * 获取文件流对象
 * @return
 * @throws Exception
 */
public InputStream getInputStream() throws Exception {
// 通过 ServletContext,也就是application 来读取数据
return getServletContext().getResourceAsStream(inputPath);
} /**
 * 双击下载文件
 * 
 * @return
 * @throws IOException
 * @throws IOException
 * @throws IOException
 */
public String downLoadFile() throws IOException {
this.inputPath = "/upload/" + "Dota英雄出装攻略_(超全版).doc";
this.fileName = "Dota英雄出装攻略_(超全版).doc";
// this.inputPath = "/upload/" + delFileName;
// this.fileName = delFileName; // 文件下载目录路径
String downloadDir = getServletContext().getRealPath("/upload"); // 文件下载路径
String downloadFile = getServletContext().getRealPath(inputPath); java.io.File file = new java.io.File(downloadFile); downloadFile = file.getCanonicalPath();// 真实文件路径,去掉里面的..等信息 // 安全性
if (!downloadFile.startsWith(downloadDir)) {
return null;
}
return SUCCESS;
} /**
 * 提供转换编码后的供下载用的文件名
 * 
 * @return
 */
public String getDownloadFileName() {
String downFileName = fileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downFileName;
}
=====================================================
Struts.xml文件下载配置<action name="downLoadFile" class="com.oa.action.FileAction"
method="downLoadFile">
<result name="success" type="stream">
<param name="contentType">
application/octet-stream;charset=ISO8859-1
</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">
attachment;filename="${downloadFileName}"
</param>
<param name="bufferSize">4096</param>
</result>
</action>
====================================================
问题:如果我直接在浏览器地址栏请求downLoadFile.action文件是可以下载写来的
但是我用Ext.Ajax.request请求Action返回的文件流对象会被放到 Ajax的success方的里面处理,所以达不到下载效果。
请问怎么解决下载问题,谢谢!AjaxExtJsJavaWeb

解决方案 »

  1.   

    为什么一定要用Ajax呢?
    直接a标签:<a href="/..url地址../..?delFileName=你的fileName">下载</a>
      

  2.   

    A标签是可以的,关键是 页面开发是Ext写的,写A标签有点复杂,但是可以实现。
    Ajax是无法实现下载的,我换了一种方法直接用 window.location.href = 'downLoadFile.action' + "?delFileName="
    + encodeURIComponent(fileName);
    这样可以提交到Action  达到下载的效果,感谢你!
      

  3.   

    楼上的全部都只能下载在web项目内部的文件,如果这个文件是硬盘上其它地方,用你们的方法还能下载吗?你们下载的文件只能是浏览器不认识的文件,要是下载的文件浏览器本身能打开呢?