首页 > 其他分享 >JS实现 ZIP 压缩包的导入解析

JS实现 ZIP 压缩包的导入解析

时间:2024-11-27 11:13:26浏览次数:4  
标签:文件 document const ZIP JS output 解析 压缩包

功能目标

在前端实现 ZIP 压缩包的解析,将文件名通过下拉框展示,并支持查看所选文件的内容。


使用技术

  1. JSZip:解析 ZIP 文件的库。
  2. FileReader:读取用户上传的文件。
  3. HTML 和 JavaScript:实现交互和动态内容展示。

实现步骤

1. 引入 JSZip

通过 CDN 或 npm 引入 JSZip:

<script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>

2. 编写 HTML 页面

提供文件上传按钮、解析按钮、下拉框选择,以及用于展示文件内容的区域。

HTML 示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ZIP 文件解析</title>
    <script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        #output {
            margin-top: 20px;
            white-space: pre-wrap;
            background-color: #f9f9f9;
            border: 1px solid #ccc;
            padding: 10px;
        }
    </style>
</head>
<body>
    <h1>ZIP 文件解析示例</h1>
    <input type="file" id="zipFile" accept=".zip" />
    <button id="parseBtn">解析</button>

    <div id="fileContainer" style="display: none;">
        <label for="fileList">选择文件:</label>
        <select id="fileList"></select>
        <button id="viewContent">查看内容</button>
    </div>

    <h3>文件内容:</h3>
    <div id="output">请选择 ZIP 文件后解析查看文件内容。</div>
    <script src="app.js"></script>
</body>
</html>

3. 编写解析逻辑

app.js 文件中实现 ZIP 解析的功能:

document.getElementById('parseBtn').addEventListener('click', async () => {
    const fileInput = document.getElementById('zipFile');
    const fileContainer = document.getElementById('fileContainer');
    const fileList = document.getElementById('fileList');
    const output = document.getElementById('output');
    output.textContent = ''; // 清空输出内容
    fileList.innerHTML = ''; // 清空下拉列表内容

    if (!fileInput.files.length) {
        alert('请选择一个 ZIP 文件');
        return;
    }

    const file = fileInput.files[0];
    const reader = new FileReader();

    reader.onload = async (e) => {
        try {
            const zip = await JSZip.loadAsync(e.target.result);

            // 遍历文件并填充下拉框
            zip.forEach((relativePath, zipEntry) => {
                const option = document.createElement('option');
                option.value = relativePath;
                option.textContent = relativePath;
                fileList.appendChild(option);
            });

            // 显示文件选择部分
            fileContainer.style.display = 'block';
            output.textContent = 'ZIP 文件解析成功!请选择文件查看内容。';

            // 添加查看内容按钮的逻辑
            document.getElementById('viewContent').addEventListener('click', async () => {
                const selectedFile = fileList.value;
                if (zip.file(selectedFile)) {
                    const content = await zip.file(selectedFile).async('text');
                    output.textContent = `文件名:${selectedFile}\n\n内容:\n${content}`;
                } else {
                    output.textContent = `无法读取文件:${selectedFile}`;
                }
            });
        } catch (err) {
            console.error('解析 ZIP 文件失败:', err);
            alert('解析 ZIP 文件失败');
        }
    };

    reader.readAsArrayBuffer(file);
});

功能说明

  1. 文件上传与解析

    • 通过文件选择框上传 ZIP 文件。
    • 使用 FileReader 将文件内容读取为二进制数据。
  2. 解析文件名

    • JSZip.loadAsync 加载 ZIP 文件。
    • 遍历 ZIP 文件的内容,提取文件名,并动态填充下拉框。
  3. 查看文件内容

    • 用户从下拉框中选择文件后,点击 "查看内容" 按钮。
    • 使用 zip.file(fileName).async('text') 读取选定文件的内容并显示。

示例效果

假如上传的 ZIP 包包含以下文件:

  • example.txt
  • data.json
  • images/photo.jpg

操作步骤:

  1. 上传 ZIP 文件,点击 解析 按钮。
  2. 下拉框显示:
    example.txt
    data.json
    images/photo.jpg
    
  3. 从下拉框中选择 example.txt,点击 查看内容
  4. 页面展示内容:
    文件名:example.txt
    
    内容:
    示例文本文件内容
    

扩展功能

  1. 文件类型过滤:限制下拉框只显示特定类型的文件(如 .txt.json)。
  2. 文件下载:使用 BlobURL.createObjectURL,允许用户下载解压后的文件。
  3. 预览非文本文件:对于图片等文件,可以用 <img> 标签显示内容。

点击查看示例HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ZIP 文件解析</title>
    <script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        #output {
            margin-top: 20px;
            white-space: pre-wrap;
            background-color: #f9f9f9;
            border: 1px solid #ccc;
            padding: 10px;
        }
    </style>
</head>
<body>
    <h1>ZIP 文件解析示例</h1>
    <input type="file" id="zipFile" accept=".zip" />
    <button id="parseBtn">解析</button>

    <div id="fileContainer" style="display: none;">
        <label for="fileList">选择文件:</label>
        <select id="fileList"></select>
        <button id="viewContent">查看内容</button>
    </div>

    <h3>文件内容:</h3>
    <div id="output">请选择 ZIP 文件后解析查看文件内容。</div>

    <script>
        document.getElementById('parseBtn').addEventListener('click', async () => {
            const fileInput = document.getElementById('zipFile');
            const fileContainer = document.getElementById('fileContainer');
            const fileList = document.getElementById('fileList');
            const output = document.getElementById('output');
            output.textContent = ''; // 清空输出内容
            fileList.innerHTML = ''; // 清空下拉列表内容

            if (!fileInput.files.length) {
                alert('请选择一个 ZIP 文件');
                return;
            }

            const file = fileInput.files[0];
            const reader = new FileReader();

            reader.onload = async (e) => {
                try {
                    const zip = await JSZip.loadAsync(e.target.result);

                    // 遍历文件并填充下拉框
                    zip.forEach((relativePath, zipEntry) => {
                        const option = document.createElement('option');
                        option.value = relativePath;
                        option.textContent = relativePath;
                        fileList.appendChild(option);
                    });

                    // 显示文件选择部分
                    fileContainer.style.display = 'block';
                    output.textContent = 'ZIP 文件解析成功!请选择文件查看内容。';

                    // 添加查看内容按钮的逻辑
                    document.getElementById('viewContent').addEventListener('click', async () => {
                        const selectedFile = fileList.value;
                        if (zip.file(selectedFile)) {
                            const content = await zip.file(selectedFile).async('text');
                            output.textContent = `文件名:${selectedFile}\n\n内容:\n${content}`;
                        } else {
                            output.textContent = `无法读取文件:${selectedFile}`;
                        }
                    });
                } catch (err) {
                    console.error('解析 ZIP 文件失败:', err);
                    alert('解析 ZIP 文件失败');
                }
            };

            reader.readAsArrayBuffer(file);
        });
    </script>
</body>
</html>

标签:文件,document,const,ZIP,JS,output,解析,压缩包
From: https://www.cnblogs.com/echohye/p/18571985

相关文章

  • 什么是JSON,有什么特点
    什么是JSON?JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的子集,但独立于语言,被广泛用于服务器与Web应用之间的数据传输。JSON格式最初由DouglasCrockford在2001年提出,并迅速成为互联网上......
  • RTSP播放器EasyPlayer.js播放器关于报“RuntimeError: abort(OOM). Build with -s ASS
    随着互联网技术的不断进步,HTML5逐渐取代了传统的HTML4,成为现代网站开发不可或缺的一部分。HTML5不仅简化了标记语言的复杂度,还引入了许多新的API和元素,极大地丰富了网页的表现力。特别是在多媒体领域,HTML5提供了原生支持音频和视频播放的功能,使得开发者无需依赖第三方插件如Flash,......
  • js如何把网页加入收藏夹功能?
    在JavaScript中,你可以使用window.external.AddFavorite方法将当前网页添加到用户的收藏夹。然而,这种方法只在InternetExplorer中有效,并且由于安全限制,现代浏览器通常已弃用或禁用此功能。对于现代浏览器,更可靠的方法是使用HTML5的链接元素<a>,并设置其rel属性为sidebar。虽然这并......
  • 请用js实现一个promise的方法
    //BasicPromiseExample:ResolvingavalueafteradelayfunctionmyPromise(delay,value){returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve(value);//Resolvewiththeprovidedvalue},delay);});}//Exa......
  • (分享源码)计算机毕业设计必看必学 上万套实战教程手把手教学JAVA、PHP,node.js,C++、pyth
    摘 要随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发达,果园信息统计管理系统的信息通过网络进行信息管理掀起了热潮,所以针对果园信......
  • (分享源码)计算机毕业设计必看必学 上万套实战教程手把手教学JAVA、PHP,node.js,C++、pyth
    摘 要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设物......
  • Threejs的三维坐标系
    在三维空间中,所有的物体和相机都需要基于一个统一的坐标系来进行定位和操作。理解坐标系的基本概念,对于创建稳定、准确的三维效果至关重要。基础Three.js采用的是右手坐标系,这意味着如果你将右手的三个手指伸直,分别指向X、Y和Z轴的方向,你的拇指指向的方向即为X轴,食指指向......
  • JAVAJSP物业管理系统源码JSP小区管理系统源码JSP小区物业管理系统源码JSP社区管理系统
    一、项目介绍系统的使用者分为用户(业主)和管理员(物业)两类,根据使用者不同,将有不同的主页,对应不同的功能权限。将本系统分为用户子系统和管理员子系统。在用户子系统中,使用者通过账号密码(用户)登入系统,进入主页,通过主页链接,进入小区服务,小区公告,信息查询,系统功能四个功能模块,在模......
  • node.js毕设秒杀系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着互联网的迅猛发展,电子商务在全球范围内蓬勃兴起。在电子商务领域中,秒杀系统成为吸引消费者、提升销售业绩的重要营销手段。关于秒杀系统的研究,现有......
  • node.js毕设基于智能算法的健康食材订购系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于健康食材订购系统的研究,现有研究主要以传统的食材订购流程优化为主,如提高配送效率、降低成本等方面。专门针对运用智能算法来构建健康食材订购系统......