ajax下載文件筆記


思路:

  后端把文件數據轉化為 base64字符串返回給前端、前端ajax獲取到字符串之后,解碼轉換為blob,之后模擬<a>標簽點擊事件下載文件。

相關代碼:

/**
     * <p>將文件轉成base64 字符串</p>
     *
     * @param path 文件路徑
     * @return
     * @throws Exception
     */
    public static String encodeBase64File(String path) throws Exception {
        File file = new File(path);
        FileInputStream inputFile = new FileInputStream(file);
        byte[] buffer = new byte[(int) file.length()];
        inputFile.read(buffer);
        inputFile.close();
        return new BASE64Encoder().encode(buffer);
    }

 

//ajax 下載文件
        $.ajax({
            url: url,
            type: 'get',
            data: {},
            success: function (res) {
                //返回的是base64字符串
                saveFile(res, '下載結果.xlsx');
            },
            error: function (err) {
                console.log(err)
            }
        });

    function saveFile(base64, fileName) {
        base64ToBlob({b64data: base64, contentType: 'application/vnd.ms-excel'}).then(blob => {
            // 轉后的blob對象
            if (window.navigator.msSaveOrOpenBlob) {
                navigator.msSaveBlob(blob, fileName)
            } else {
               //模擬<a>標簽的點擊事件
                let link = document.createElement('a')
                link.href = window.URL.createObjectURL(blob)
                link.download = fileName
                link.click()
                window.URL.revokeObjectURL(link.href)
            }
        })
    }

    //base64轉blob
    function base64ToBlob({b64data = '', contentType = '', sliceSize = 512} = {}) {
        return new Promise((resolve, reject) => {
            // 使用 atob() 方法將數據解碼
            let byteCharacters = atob(b64data);
            let byteArrays = [];
            for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
                let slice = byteCharacters.slice(offset, offset + sliceSize);
                let byteNumbers = [];
                for (let i = 0; i < slice.length; i++) {
                    byteNumbers.push(slice.charCodeAt(i));
                }
                // 8 位無符號整數值的類型化數組。內容將初始化為 0。
                // 如果無法分配請求數目的字節,則將引發異常。
                byteArrays.push(new Uint8Array(byteNumbers));
            }
            let result = new Blob(byteArrays, {
                type: contentType
            })
            result = Object.assign(result, {
                // 這里一定要處理一下 URL.createObjectURL
                preview: URL.createObjectURL(result),
                name: `下載文件.xlsx`
            });
            resolve(result)
        })
    }    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM