說明:Ajax是沒法實現文件傳輸的,本文只是模擬了Ajax不刷新頁面就能夠請求並返回數據的效果。實質上仍是經過提交form表單來返回文件流的輸出。java
分步實現邏輯:ajax
貼上部分代碼供參考:數據庫
js代碼:json
1. js寫一個動態建立並提交form表單的方法,依賴於jQuery插件。服務器
// 文件下載 jQuery.download = function(url, method, filedir, filename){ jQuery('<form action="'+url+'" method="'+(method||'post')+'">' + // action請求路徑及推送方法 '<input type="text" name="filedir" value="'+filedir+'"/>' + // 文件路徑 '<input type="text" name="filename" value="'+filename+'"/>' + // 文件名稱 '</form>') .appendTo('body').submit().remove(); };
2. 查詢數據,輸出到文件,保存到服務器,並調用download方法實現下載網絡
// 查詢數據,輸出到文件,保存到服務器,並實現下載 function exportOilDetection() { var ids = ['1','2','3','4']; // 查詢參數表明(可根據實際狀況修改),須要導出數據的id $.ajax({ type : 'POST', dataType : 'json', async : false, url : "${pageContext.request.contextPath}/oilDetectionAction!ajaxExportOilDetectionInfos.action", // 生成文件,保存在服務器 data : { ids : ids, }, success : function(data) { var result = data["data"]; if (result[0] == "success") { // result[0] -- 文件生成成功標記 // result[1] -- 路徑 // result[2] -- 文件名稱 $.download('oilDetectionAction!ajaxDownloadDataExcel.action', 'post', result[1], result[2]); // 下載文件 } else { alert("數據導出失敗!"); } }, error : function(XMLHttpRequest, textStatus, e) { console.log("oilDetection.js method exportOilDetection" + e); } }); }
action文件配置app
<action name="oilDetectionAction" class="oilDetectionAction"> <result name="ajax" type="json"> <param name="root">result</param> </result> <result name="success">/page/oilDetection.jsp</result> </action>
java代碼:jsp
public class OilDetectionAction implements ServletResponseAware { HttpServletResponse response; /** * 自動注入response */ public void setServletResponse(HttpServletResponse response) { this.response = response; } .... }
public class OilDetectionAction implements ServletResponseAware { .... /** * 將生成的文件網絡傳輸到客戶端 */ public void ajaxDownloadDataExcel() throws IOException { InputStream ins = null; BufferedInputStream bins = null; OutputStream outs = null; BufferedOutputStream bouts = null; String file_name = getRequest().getParameter("file_name").trim(); // 文件名 String file_dir = getRequest().getParameter("file_dir").trim(); // 文件路徑 System.out.println("獲取到文件路徑:" + file_dir + File.separator + file_name); try { if (!"".equals(file_name)) { File file = new File(file_dir + File.separator + file_name); if (file.exists()) { ins = new FileInputStream(file_dir + File.separator + file_name); bins = new BufferedInputStream(ins); outs = response.getOutputStream(); bouts = new BufferedOutputStream(outs); response.setContentType("application/x-download"); response.setHeader( "Content-disposition", "attachment;filename=" + URLEncoder.encode(file_name, "UTF-8")); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) { bouts.write(buffer, 0, bytesRead); } bouts.flush(); } else { throw new Exception("下載的文件不存在!"); } } else { throw new Exception("導出文件時發生錯誤!"); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { if (null != ins) { ins.close(); } if (null != bins) { bins.close(); } if (null != outs) { outs.close(); } if (null != bouts) { bouts.close(); } } } }