一个客户端实现多图下载并打zip包下载到本地的小功能

首先要想的第一个问题是:客户端是否能实现这种功能。

答案很肯定:可以!

为什么可以:玩了一天这类API(太浪费时间了,害的我大周六都得不到消停,太可耻啦,啊!!!),其实这类功能一般后台直接打包好了丢过来一个连接,a链接一跳完犊子。之所以按标题这么做完全是缓解服务器压力,服务器上的一部分工作丢到客户端来做,从而使得客户端得到更快的响应。

不解释(主要是我这人越解释越乱),贴代码:

// 示例基于react,其他框架或库使用时根据自身情况稍作改动就可以
// 在react项目下是可以直接运行的一段代码

import React from 'react'
import JSZip from 'jszip'
import { saveAs } from 'file-saver'
import axios from 'axios'
class BuildZIP extends React.Component {
    // 页面中只要渲染了该组件,直接下载zip
    componentDidMount() {
        let Urls = [
            'http://img8.zol.com.cn/bbs/upload/23766/23765836.jpg',
            'http://img4.cache.netease.com/game/2010/11/15/201011151148508a83f.jpg'
        ];
        let fetchImgurlArr = [];
        for (let url of Urls) {
            fetchImgurlArr.push(this.fetchImgUrlToBase64(url));
        }
        Promise.all(fetchImgurlArr).then(imgDatas => {
            const zip = new JSZip();
            let img = zip.folder("images");
            for(let i = 0; i< imgDatas.length; i++) {
                const Base64Data = imgDatas[i].substring(imgDatas[i].indexOf(',') + 1);
                img.file(i + ".jpg", Base64Data, { base64: true });
            }
            zip.generateAsync({ type: "blob" }).then(function(content) {
                // see FileSaver.js
                saveAs(content, "美女图片.zip");
            });
        }).catch(err => {
            console.log('结果:', err)
        })
        // this.getImage('http://img8.zol.com.cn/bbs/upload/23766/23765836.jpg')
    }
    fetchImgUrlToBase64(url) {
        return new Promise((resolve, reject) => {
            axios.get(url, { responseType: 'blob' }).then(res => {
                let reader = new FileReader()
                reader.onload = (e) => {
                    resolve(e.target.result);
                }
                reader.onerror = err => {
                    reject('读取图片发生错误');
                }
                reader.readAsDataURL(res.data);
            }).catch(err => {
                reject('请求图片发生错误');
            });
        })
    }

    // 实现方式二:只写了实现上不同的部分(请求图片 和 把图片转为base64的方式 与上边不一样)。
    // getBase64Image(img) {
    //     var canvas = document.createElement("canvas");
    //     canvas.width = img.width;
    //     canvas.height = img.height;
    //     var ctx = canvas.getContext("2d");
    //     ctx.drawImage(img, 0, 0, img.width, img.height);
    //     var dataURL = canvas.toDataURL("image/jpeg");    // 可选其他值 image/jpeg
    //     return dataURL;
    // }
    // getImage(src) {
    //     return new Promise((resolve, reject) => {
    //         var image = new Image();
    //         image.src = src + '?v=' + Math.random(); // 处理缓存
    //         image.crossOrigin = "*"; // 支持跨域图片
    //         image.onload = function (e) {
    //             console.log('onload: ', e);
    //             var base64 = this.getBase64Image(image);
    //             resolve(base64);
    //         }
    //         image.onerror = function (e) {
    //             console.log('onerror: ', e);
    //             reject(e)
    //         }
    //     })
    // }

    render() {
        return <div>
            <h1>JSZip</h1>
        </div>
    }}

export default BuildZIP;

复制代码

刚开始锻炼自己写文章,同时也是自己的一个代码累积,希望以后能写出热门文章,加油!

睡觉,晚安!!!


转载于:https://juejin.im/post/5d052f2c51882537b945d382

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值