zoukankan      html  css  js  c++  java
  • Ajax 实现导出文件-支持批量

    个人感觉前端不行,好多东西记不住,所以只能将遇到的坎以及解决方案记录下,方便以后用到时查找。

    首先:ajax不支持流,网上找了好多版本,感觉下面的方案不错,实验了下可行。

    前端页面:

     <div class="div-tbl">
            <h1></h1>
            <div class="div-btn">
                <button id="commitClo" class="btn btn-primary">Commit</button>
                <button id="testCommit" class="btn btn-primary">Test</button>
            </div>
        </div>
    
    <script>
         $("#testCommit").on("click",function(){
                var testData = {
                    "owner": "FIXDATA",
                    "tableName": "L_TBL_USER",
                    "tableDescribe": "用户表",
                    "autoFlag": "Yes",
                    "columnList": [{
                        "columnName": "id",
                        "columnDescribe": "",
                        "columnType": "varchar2(30)",
                        "columnNullFlag": "No",
                        "defaultVal": ""
                    }, {
                        "columnName": "name",
                        "columnDescribe": "",
                        "columnType": "VARCHAR2(30)",
                        "columnNullFlag": "No",
                        "defaultVal": ""
                    }, {
                        "columnName": "age",
                        "columnDescribe": "",
                        "columnType": "number(2)",
                        "columnNullFlag": "No",
                        "defaultVal": ""
                    }],
                    "inxList": [{
                        "owner": "FIXDATA",
                        "tableName": "L_TBL_USER",
                        "inxColumnNames": "id",
                        "indexType": "1"
                    }],
                    "grtList": [{
                        "owner": "FIXDATA",
                        "tableName": "L_TBL_USER",
                        "roleName": "chen",
                        "operateArr": "select,insert,update,delete"
                    }]
                };
    
                $.ajax({
                    type: "post",
                    url: "/export/orcSql",    //向后端请求数据的url
                    data: JSON.stringify(testData) ,
                    dataType:"text",//返回数据类型
                    //默认application/x-www-form-urlencoded;charset=UTF-8
                    //springmvc @RequestBody注解做提交json字符串自动绑定到pojo入参时
                    contentType: "application/json;charset=UTF-8",
                    success: function (data) {
                        var jsonData = JSON.parse(data);
                        if(jsonData["result"] === "1"){
                            batchDownLoadFile(jsonData["body"]);
                        }
    
                    },error:function (data) {
                        console.log(2222);
                    }
                });
            });
    </script>

    自定义js:

    /**
     * AJAX导出文件测试
     * @param obj
     */
    function ajaxExportFileTest(obj) {
        $.ajax({
            url : "ajaxExportFileTest",
            type : "post",
            success : function (result) {
                if (result){
                    let filename = "ceshi.xlsx";
                    let blob = getBlob(result,{type: "application/vnd.ms-excel"});
                    let isDown = true;
                    let url = downloadBlob(filename,blob,isDown);
                    console.log(url);
                }
            }
        });
    
    }
    
    /**
     * 获取Blob
     * @param base64 base64字符串
     * @param contentType 导出格式 MIME 类型
     * @param sliceSize 分割大小
     * @returns {Blob}
     */
    function getBlob(base64, contentType, sliceSize) {
        contentType = contentType || '';
        sliceSize = sliceSize || 512;
    
        let byteCharacters = atob(base64);
        let byteArrays = [];
    
        for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            let slice = byteCharacters.slice(offset, offset + sliceSize);
    
            let byteNumbers = new Array(slice.length);
            for (let i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }
    
            let byteArray = new Uint8Array(byteNumbers);
    
            byteArrays.push(byteArray);
        }
    
        return new Blob(byteArrays, {type: contentType});
    }
    
    /**
     * 下载文件
     * @param fileName 文件名
     * @param blob BLOB对象
     * @param isDown 是否下载,默认不下载
     * @returns {string} 返回url
     */
    function downloadBlob(fileName, blob,isDown){
        //默认不下载,返回url
        //判断是直接下载还是返回对应的URL
        let url = URL.createObjectURL(blob);
        if (isDown){
            //如果是直接下载,利用a标签来实现下载
            let docEle = document;
            let link = docEle.createElement("a");
            link.innerHTML = fileName;
            link.download = fileName;
            link.href = url;
            docEle.getElementsByTagName("body")[0].appendChild(link);
            link.click();
            $(link).remove();
        }
        return url;
    }
    
    function batchDownLoadFile(objArr){
       $.each(objArr,function(key,val){
           downLoadFile(val["fileName"],val["content"]);
       })
    }
    
    function downLoadFile(fileName,content){
        let blob = getBlob(content,{type: "application/octet-stream"});
        let isDown = true;
        let url = downloadBlob(fileName,blob,isDown);
    }

    后端实现:

    package com.example.demo.controller;
    
    import com.example.demo.dto.TableDto;
    import com.example.demo.service.TestService;
    import com.example.demo.util.CommonCollectionUtils;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    @Controller
    @RequestMapping("/export")
    public class ExportController {
    
        @Resource
        private TestService testService;
    
        @ResponseBody
        @RequestMapping(value = "/orcSql",method = RequestMethod.POST)
        public Map<String, Object> export(@RequestBody TableDto dto, HttpServletResponse response) throws IOException {
            System.out.println(dto);
    
            response.setStatus(HttpStatus.OK.value());
    
            Map<String, Object> resultMap = CommonCollectionUtils.newHashMapInstance();
    
            List<Map<String,String>> bodyList = new ArrayList<Map<String,String>>();
            Map<String,String> fileMap1 = CommonCollectionUtils.newHashMapInstance();
            fileMap1.put("fileName","11111.sql");
            fileMap1.put("content",testService.exportExcelFileBase64Str("Hello,1111"));
    
            Map<String,String> fileMap2 = CommonCollectionUtils.newHashMapInstance();
            fileMap2.put("fileName","2222.sql");
            fileMap2.put("content",testService.exportExcelFileBase64Str("Hello,2222"));
    
            bodyList.add(fileMap1);
            bodyList.add(fileMap2);
    
            resultMap.put("result","1");
            resultMap.put("body",bodyList);
    
            return resultMap;
        }
    
        @PostMapping(value = "/ajaxExportFileTest")
        @ResponseBody
        public String ajaxExportFileTest(HttpServletResponse response){
            response.setStatus(HttpStatus.OK.value());
            return testService.exportExcelFileBase64Str("Hello,Heoo!");
        }
    }

    测试:

  • 相关阅读:
    SSH 密钥类型的的选择
    VMware 默认的虚拟交换机关系与VMnet设置
    路由器端口映射不生效的解决方法
    优先使用对象组合,而不是类继承
    权限管理系统之软件注册模块
    如何正确安装phpDocumentor
    IE下cookie跨域问题
    Linux下Apache无法解析.php文件
    用 memcache 来存储 session
    windows7 下 phpunit 安装
  • 原文地址:https://www.cnblogs.com/xiaozhuanfeng/p/11012059.html
Copyright © 2011-2022 走看看