zoukankan      html  css  js  c++  java
  • Angular 学习笔记 work with zip (压缩文件格式)

    最近在做批量创建. 

    上回说到了 读写 excel, 那么就可以通过 excel 的资料来创建资料了。但是资料经常会有图片,而 excel 里面放图片有点不太好.

    于是就想 upload excel 的同时在附带另一个 folder 里面装图片, excel 就写对应的图片名字就好了. 

    那一个 table 可能有好几个 column 都是图片, 如果把图片一股脑丢 input file 体验不太好. 所以最好是分几个 folder 装图片对应 column 

    然后 zip 起来丢 input file. 虽然 input file 是可以支持丢 folder 的, 但是 safari 好像是不支持的. 

    所以还是用 zip 比较妥当. windows 10 都自带 zip 对用户来说不算太难. 

    那么来说说 js 如果读写 zip file.

    nodejs 发展多年,你说没有 plug in 做这个事没有人会相信. 所以随便找一下就有了. 

    https://github.com/Stuk/jszip

    有 .d.ts 所以对 ng 很友好.

    跟着做就可以了

    https://stuk.github.io/jszip/documentation/examples/read-local-file-api.html

    太简单这里就不叙述了.

    上面只是读,写的部分目前没有需求所以我也没有测试. 以后要才看呗

    记入一下基础的东西.

    ArrayBuffer, Blob 我经常搞混. 可以看这篇

    https://www.gobeta.net/books/ruanyf-javascript-tutorial/bom/arraybuffer/

    ArrayBuffer 有点像 c# 的 memory stream 

    blob 像 file stream 

    平时 input file 的 File 对象,是 blob 的一个衍生来的.

    所以通常我们会用到的是 blob

    大概懂就好啦. 够用

    记入一下测试的代码

    import * as JSZip from 'jszip';
    
    const input = document.getElementById('input') as HTMLInputElement;
    input.addEventListener('input', async e => {
        const file = Array.from(input.files)[0];
        // const arrayBuffer = await raedFileAsync(file);
        const zip = await JSZip.loadAsync(file);
        console.log(zip);
        type PathAndZipEntry = {
            relativePath: string;
            file: JSZip.JSZipObject;
        }
        const pathAndZipEntries: PathAndZipEntry[] = [];
        zip.forEach((relativePath, file) => {
            pathAndZipEntries.push({ relativePath, file });
        });
        const ajaxAsync = async (blob: Blob, fileName: string): Promise<any> => {
            return new Promise(resolve => {
                const formData = new FormData();
                formData.append('file', blob, fileName);
                const xhr = new XMLHttpRequest();
                xhr.open('POST', 'http://192.168.1.152:61547/api/uploadFile');
                xhr.onload = () => {
                    resolve(xhr.response);
                }
                xhr.send(formData);
            });
        }
    
        for await (const { relativePath, file } of pathAndZipEntries) {
            console.log('relativePath', relativePath);
            const paths = relativePath.split('/');
            const blob = await file.async('blob');
            console.log(await ajaxAsync(blob, paths[paths.length - 1]));
        }
    
        input.value = '';
    });
  • 相关阅读:
    6389. 【NOIP2019模拟2019.10.26】小w学图论
    6383. 【NOIP2019模拟2019.10.07】果实摘取
    三分查找求极值
    51Nod 1278 相离的圆
    51 Nod 1092 回文字符串
    关于原根(来自百度百科)
    Hdu 1358 Period
    最大子矩阵和
    51 Nod 1072 威佐夫游戏
    The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online(2018 青岛网络预选赛)
  • 原文地址:https://www.cnblogs.com/keatkeat/p/12944587.html
Copyright © 2011-2022 走看看