Vue-前端下载zip(图片)

数据多了就很卡 pass掉 还是找后端吧
只提供npm包的插件 可以看看 数据量小前端下载也可以
主要是下载图片
在这里插入图片描述
在这里插入图片描述

下载方式

npm install jszip
npm install file-saver

这里下载的min.js使用的
主要
1创建二维码
2将TEST_AAA通过canvas添加到二维码上 再返回图片
3-1 resultBase64Image 生成的结果二维码 可以用于展示
3-2 resultBlobFile 生成的二维码blob文件 用于压缩包下载
3-3 multipleDownload 下载压缩包 格式 [{name,type:‘png’,blobFile}]
3-3-1 last: true // 最后一层不需要创建文件时
3-4 onceDownload 下载一张图片 直接下载的png图
3-5 urlChangeImage 转二维码方法
3-6 imageChangeCanvas 添加文本的二维码方法返回图片
3-7 canvasChangeBlob base64转blob

const zip = new JSZip()
zip的folder 创建文件夹
const fold = zip.folder(zipName)
file 像当前folder里添加blob文件
fold.file(${data.name}.${data.type}, data.blobFile, { base64: true })
zip.generateAsync 生成压缩包
generateAsync({ type: ‘blob’, compression: ‘DEFLATE’, compressionOptions: { level: 9 } }).then(async content => {
saveAs FileSaver内部下载zip方法
saveAs(content, zipName)
模块: FileSaver.saveAs (content,zipName)
})

<script src="./jszip.min.js"></script>
    <script src="./FileSaver.min.js"></script>
    <script src="./qrCode.js"></script>
     <script>
        const upload = async () => {
            const {
                resultBase64Image,
                resultBlobFile,
                multipleDownload,
                onceDownload, } = await erCodeCallback("https://www.baidu.com", 'TEST_AAA')
            const result = resultBlobFile
            multipleDownload([
                {
                    name: 'test1',
                    blobFile: result,
                    type: 'png',
                    children: [
                        {
                            name: 'child1',
                            blobFile: result,
                            type: 'png',
                            last: true,
                            children: [
                                {
                                    name: 'ren1',
                                    blobFile: result,
                                    type: 'png'
                                }, {
                                    name: 'ren2',
                                    blobFile: result,
                                    type: 'png'
                                }
                            ]
                        },
                        {
                            name: 'child2',
                            blobFile: result,
                            type: 'png'
                        },
                    ]
                },
                {
                    name: 'test2',
                    last: true,
                    children: [
                        {
                            name: 'child3',
                            blobFile: result,
                            type: 'png'
                        }, {
                            name: 'child4',
                            blobFile: result,
                            type: 'png'
                        },
                    ]
                }],
                'zipName'
            )
        }
        // 主要代码
        const erCodeCallback = async (erCodeUrl, ctxText) => {
            // 创建二维码
            function urlChangeImage(url, options) {
                if ([undefined, null].includes(url)) {
                    throw '二维码地址为空'
                }
                const newElement = document.createElement('div')
                newElement.className = 'newErCodeElement'
                // document.styleSheets[0].insertRule(
                //     '.newErCodeElement{display:inline-block',
                //     document.styleSheets[0].cssRules.length,
                // )
                const qrCode = new QRCode(newElement, {
                    text: url,
                    width: 300,
                    height: 300,
                    ...options
                });
                const canvas = newElement.childNodes[0]
                return canvas.toDataURL()
            }
            // 将qrCode返回的图片传入
            function imageChangeCanvas(text, url) {
                if ([undefined, null].includes(url)) {
                    throw '二维码base64图片url为空'
                }
                return new Promise((resolve, reject) => {
                    let result = ''
                    const canvas = document.createElement('canvas')
                    const w = 300, h = 300
                    canvas.setAttribute('width', w)
                    canvas.setAttribute('height', h)
                    canvas.style.background = '#fff'
                    const ctx = canvas.getContext('2d')
                    let img = new Image();
                    img.src = url;
                    img.onload = function () {
                        ctx.fillStyle = '#fff';
                        ctx.fillRect(0, 0, w, h)
                        ctx.drawImage(img, 10, 10, w - 20, h - 20)
                        ctx.fillStyle = '#fff';
                        ctx.fillRect(45, h / 2 - (40 / 2), w - (45 * 2), 40)
                        ctx.fillStyle = 'rgb(89, 96, 246)';
                        ctx.font = '30px Arial'
                        ctx.textBaseline = 'middle'
                        ctx.textAlign = 'center'
                        ctx.fillText(text, w / 2, h / 2);
                        result = canvas.toDataURL()
                        resolve(result)
                    }
                })
            }
            // 递归创建文件夹和添加图片
            function recursionCreateFold(list, zip) {
                const addFold = (data, workFold) => {
                    if (data.blobFile && data.type) {
                        workFold.file(`${data.name}.${data.type}`, data.blobFile, { base64: true })
                    }
                }
                const result = list.map((item) => {
                    const fold = zip.folder(item.name)
                    if (item.children) {
                        if (item.last) {
                            item.children.forEach((val) => {
                                addFold(val, fold)
                                if (val.children) {
                                    recursionCreateFold(item.children, fold)
                                }
                            })
                        } else {
                            recursionCreateFold(item.children, fold)
                        }
                    }
                    addFold(item, fold)
                    return fold
                })
                return result
            }
            // 多个下载图片压缩包 {name,file,type}
            function multipleDownload(fileList, zipName) {
                if (!fileList || fileList.length < 1 || !Array.isArray(fileList)) {
                    throw `没有可下载项,fileList:格式${JSON.stringify([{ name: 'name', blobFile: 'blobFile', type: 'png' }])}`
                }
                if (!zipName || typeof zipName !== 'string') {
                    throw '请输入zip名称'
                }
                const zip = new JSZip()
                const fold = zip.folder(zipName)
                recursionCreateFold(fileList, fold)
                zip
                    .generateAsync({ type: 'blob', compression: 'DEFLATE', compressionOptions: { level: 9 } })
                    .then(async content => {
                        saveAs(content, zipName)
                    })
            }
            // 一个下载图片
            function onceDownload(url, name) {
                if (!url || url.length < 1 || typeof url !== 'string') {
                    throw 'url参数错误'
                }
                if (!name || typeof name !== 'string') {
                    throw '请输入zip名称'
                }
                const tempLink = document.createElement('a')
                tempLink.style.display = 'none'
                tempLink.href = url
                tempLink.setAttribute('download', name)
                if (typeof tempLink.download === 'undefined') {
                    tempLink.setAttribute('target', '_blank')
                }
                document.body.appendChild(tempLink)
                tempLink.click() // 启动下载
                document.body.removeChild(tempLink)
                window.URL.revokeObjectURL(url)
            }
            // 转blob
            function canvasChangeBlob(data) {
                const arr = data.split(',')
                const dataType = arr[0].match(/:(.*?);/)[1]
                const dataContent = window.atob(arr[1])
                let i = dataContent.length
                const u8arr = new Uint8Array(i)
                while (i--) {
                    u8arr[i] = dataContent.charCodeAt(i)
                }
                const newBlobValue = new Blob([u8arr], { type: dataType })
                return newBlobValue
            }
            const base64Img = await urlChangeImage(erCodeUrl)
            const resultBase64Image = await imageChangeCanvas(ctxText, base64Img)
            const resultBlobFile = canvasChangeBlob(resultBase64Image)
            return {
                multipleDownload,
                onceDownload,
                resultBase64Image,
                resultBlobFile,
                urlChangeImage,
                imageChangeCanvas,
                canvasChangeBlob
            }
        }

//  0 const {resultBase64Image,resultBlobFile,multipleDownload,onceDownload } = await erCodeCallback("https://www.baidu.com", 'SHA037_T1')
//  1 获取列表 循环 执行erCodeDownload('https://www.baidu.com', 'SHA037_T1') 转换为二维码图片 resultBase64Image
//  2 点击单图片 aDownLoad(img.src,name)
//  3 一键下载 获取全部列表文件 需要有type和blobFile参数才会添加图片
        /**
         * multipleDownload([
                        {
                            name: 'test1',
                            blobFile: result,
                            type: 'png',
                            children: [
                                {
                                    name: 'child1',
                                    blobFile: result,
                                    type: 'png',
                                    last:true, // 最后一层不需要创建文件时
                                    children: [
                                        {
                                            name: 'ren1',
                                            blobFile: result,
                                            type: 'png'
                                        }, {
                                            name: 'ren2',
                                            blobFile: result,
                                            type: 'png'
                                        }
                                    ]
                                },
                                {
                                    name: 'child2',
                                    blobFile: result,
                                    type: 'png'
                                },
                            ]
                        },
                        {
                            name: 'test2',
                            last:true,
                            children: [
                                {
                                    name: 'child3',
                                    blobFile: result,
                                    type: 'png'
                                }, {
                                    name: 'child4',
                                    blobFile: result,
                                    type: 'png'
                                },
                            ]
                        }], 
                        'zipName'
                        )
        */

    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vue-devtools-5.1.1.zip 是一个用于 Vue.js 的开发工具包,它提供了在 Chrome 浏览器中进行 Vue.js 应用程序调试的能力。 在 Chrome 浏览器中,我们可以通过安装 vue-devtools-5.1.1.zip 这个插件来使用这个开发工具。安装插件后,我们可以在开发者工具中找到 Vue Devtools 选项,并点击进行打开。 打开 Vue Devtools 后,我们可以看到左侧面板列表列出了 Vue.js 应用程序的组件层次结构。通过展开组件,我们可以查看每个组件的状态、属性和事件。可以通过在这些组件上进行查看、编辑和监视来进行调试。 此外,Vue Devtools 还提供了性能分析的功能。我们可以通过选择 Performance 标签并执行一些操作来检查 Vue 应用程序的性能瓶颈。这个工具可以帮助我们优化代码并提高应用程序的性能。 总之,vue-devtools-5.1.1.zip 是一个方便的开发工具包,能够帮助我们在 Chrome 浏览器中进行 Vue.js 应用程序的调试和性能分析。通过使用它,我们可以更方便地开发和调试 Vue.js 应用程序,并优化其性能。 ### 回答2: vue-devtools-5.1.1.zipVue.js 的开发者工具的版本为 5.1.1 的压缩文件。Chorme 是指 Google Chrome 这个浏览器。 Vue.js 是一个流行的 JavaScript 前端框架,使用它可以更高效地构建用户界面。而 vue-devtools 则是 Vue.js 的浏览器插件,帮助开发者在 Chrome 浏览器上更方便地调试和分析 Vue.js 应用程序。 vue-devtools-5.1.1.zipvue-devtools 的一个特定版本的压缩文件,包含了安装 vue-devtools 所需的所有文件。这个压缩文件可以通过下载的方式获取。 Chorme 是一款流行的网络浏览器,被广泛应用于各种操作系统和设备上。为了使用 vue-devtools,你需要将下载vue-devtools-5.1.1.zip 文件解压缩,并在 Chrome 浏览器中安装 vue-devtools 插件。安装成功后,你可以在开发者工具中找到 Vue 选项卡,以便于调试 Vue.js 应用程序。 总结起来,vue-devtools-5.1.1.zipVue.js 的开发者工具的特定版本的压缩文件,Chorme 是指用于安装该压缩文件并调试 Vue.js 应用程序的 Google Chrome 浏览器。 ### 回答3: vue-devtools-5.1.1.zipVue.js开发工具的压缩文件,用于在Chrome浏览器中进行Vue.js应用程序的开发和调试。此工具是由Vue.js团队开发的,旨在简化开发人员在开发过程中对Vue.js应用程序进行调试和分析的工作。 使用vue-devtools,开发人员可以方便地检查Vue组件的状态、观察和修改数据、查看组件层次结构等。它提供了一个直观的用户界面,让开发人员可以更好地了解和分析他们的Vue.js应用程序。 要将vue-devtools添加到Chrome浏览器中,首先需要将zip文件下载到本地计算机。然后,在Chrome浏览器的地址栏中输入"chrome://extensions/",打开扩展程序页面。在该页面的右上角开启开发者模式,然后点击"加载已解压的扩展程序"按钮。 选择下载vue-devtools zip文件,然后点击确认。这样,vue-devtools就会被添加到Chrome浏览器的扩展程序列表中。之后,在开发Vue.js应用程序时,可以通过单击Chrome浏览器的扩展程序图标,打开vue-devtools面板,并进行相关调试和分析操作。 总之,vue-devtools是一个非常有用的工具,可以大大简化Vue.js应用程序的开发和调试过程,提高开发效率。通过将其添加到Chrome浏览器中,开发人员可以更方便地使用此工具进行Vue.js应用程序的调试和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值