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 = '';
    });
  • 相关阅读:
    fetch函数的使用-常见问题
    React的理解-入门指导
    Navicat for mysql 11.1.20激活
    sqlserver使用job删除过期备份文件
    sqlserver删除重复的数据
    提高code效率
    Wampserver红色橙色解决思路----端口冲突是关键
    java mvc框架系列总结ssh,ssm,servlet
    正则表达式入门案例C#
    SpringBoot开发之《兼容http和https同时访问时443端口被占用》
  • 原文地址:https://www.cnblogs.com/keatkeat/p/12944587.html
Copyright © 2011-2022 走看看