1. 程式人生 > >Ajax異步請求返回文件流(eg:導出文件時,直接將導出數據用文件流的形式返回客戶端供客戶下載)

Ajax異步請求返回文件流(eg:導出文件時,直接將導出數據用文件流的形式返回客戶端供客戶下載)

usermode table logs param onload img height tle http

在異步請求中要返回文件流,不能使用JQuery,因為$.ajax,$.post 不支持返回二進制文件流的類型,可以看到下圖,dataType只支持xml,json,script,html這幾種格式,沒有blob類型。所以只能選擇使用原生Ajax XMLReques對象進行處理

技術分享圖片

前端代碼

function output() {
            var branchCode = $("#currentBranchCode").val();
            var transDate = $("#currentTransDate").val();
            if (branchCode == "" || transDate == "") {
                layer.msg(
"暫無記錄,無法導出", { icon: 7, time: 1000 }); return; } var fileName = $("table caption").html() + ".xls";//設置下載時候的文件名 //要請求的Url和攜帶的參數 var url = "/SellAnalyze/Export?currentBranchCode=" + branchCode + "&currentTransDate=" + transDate; var
xhr = new XMLHttpRequest(); //設置響應類型為blob類型 xhr.responseType = "blob"; xhr.onload = function () { if (this.status == "200") {
            //獲取響應文件流  
var blob = this.response; var aElem = document.getElementById("exportUrl");
            //將文件流保存到a標簽
aElem.href
= window.URL.createObjectURL(blob); aElem.download = fileName; aElem.onload = function (e) { window.URL.revokeObjectURL(aElem.href); }; $("#exportUrl").removeClass("hidden"); layer.confirm(‘文件已導出, 立即下載?‘, function (index) { $("#download").click(); layer.close(index); }); } } xhr.open("post", url, true); xhr.send(); }

後端代碼

     public ActionResult Export(int? currentBranchCode, DateTime currentTransDate)
        {
            MemoryStream ms = NPOIExcelWrite(datas);
            ms.Seek(0, SeekOrigin.Begin);
            return File(ms, "application/vnd.ms-excel");
        }
        
        /// <param name="datas">寫入的數據</param>
        /// <returns></returns>
        private MemoryStream NPOIExcelWrite(SellDTO[] datas)
        {
            string[] titles = { "貨品類別", "貨品類別描述", "銷售額", "同比", "環比" };
            NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
            NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("Sheet1");
            NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
            for (int i = 0; i < titles.Length; i++)
            {
                row.CreateCell(i).SetCellValue(titles[i]);
            }
            for (int i = 0; i < datas.Length; i++)
            {
                row = sheet.CreateRow(i + 1);
                row.CreateCell(0).SetCellValue(datas[i].JewelryType);
                row.CreateCell(1).SetCellValue(datas[i].JewelryTypeDesc);
                row.CreateCell(2).SetCellValue(datas[i].CurrentMonthSaleroom.ToString("F2"));
                row.CreateCell(3).SetCellValue(datas[i].YearOverYear);
                row.CreateCell(4).SetCellValue(datas[i].LinkRelative);
            }

            MemoryStream ms = new MemoryStream();
            book.Write(ms);
            ms.Flush();
            book = null;
            return ms;
        }

參考:https://blog.csdn.net/swl979623074/article/details/77855629/

https://www.cnblogs.com/cdemo/p/5225848.html

https://blog.csdn.net/fangchen12312/article/details/55271296

Ajax異步請求返回文件流(eg:導出文件時,直接將導出數據用文件流的形式返回客戶端供客戶下載)