Ajax下載文件(頁面無刷新)

說明:Ajax是沒法實現文件傳輸的,本文只是模擬了Ajax不刷新頁面就能夠請求並返回數據的效果。實質上仍是經過提交form表單來返回文件流的輸出。java

分步實現邏輯:ajax

  1. ajax請求服務器,訪問數據庫,根據查詢到的數據生成一個數據文件,返回前臺一個json對象(可放置生成成功標記,文件路徑等信息)。
  2. ajax success回調函數部分,根據返回的json對象,調用手寫的js下載文件的方法,實現頁面無刷新下載文件。

 

貼上部分代碼供參考:數據庫

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

  • ajax生成文件後,會返回json類型結果
        <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

  • 返回文件流需藉助response對象,因此action類須要實現ServletResponseAware接口,並聲明response對象自動注入
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();
            }
        }
    }
}
相關文章
相關標籤/搜索