首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在javascript中使用JSZIP提取压缩文件

在javascript中使用JSZIP提取压缩文件
EN

Stack Overflow用户
提问于 2016-09-05 01:44:34
回答 4查看 44.9K关注 0票数 17

在我的网页中,用户应该上传一个压缩文件。压缩文件中有两个文件:另一个zip文件和一个txt文件。在我的服务器上,在收到zip后,我想解压缩zip文件以解压缩zip & txt文件,然后将这2个文件移动到预定义的文件夹中。我有一个提取zip文件的代码,但是数据似乎不正确。首先,当只有1 txt文件时,它解压缩了zip和2 txt文件。它创建了一个额外的“未定义”txt文件。另外,在我的txt文件中,它代替了原始数据,代之以以下文本:“未定义”。

有人能帮我吗?以下是我的代码:

代码语言:javascript
运行
复制
var JSZip = require('JSZip');

fs.readFile( filePath, function(err, data){
  if (!err){
    var zip = new JSZip();
    JSZip.loadAsync(data).then(function(zip){
      object.keys(zip.files).forEach(function(filename){
        var content = zip.files[filename];
        var dest = path + filename;
        fs.writeFileSync(dest, content);
      });
    });
  }
});
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-05 05:38:03

这需要对他们的文档进行一些深入研究,但是他们有一个一个例子,它展示了如何从ZIP读取文件内容。

您将得到描述ZIP内容的对象,而不是实际的内容。以下是调整后的版本:

代码语言:javascript
运行
复制
var JSZip = require('JSZip');

fs.readFile(filePath, function(err, data) {
    if (!err) {
        var zip = new JSZip();
        zip.loadAsync(data).then(function(contents) {
            Object.keys(contents.files).forEach(function(filename) {
                zip.file(filename).async('nodebuffer').then(function(content) {
                    var dest = path + filename;
                    fs.writeFileSync(dest, content);
                });
            });
        });
    }
});
票数 17
EN

Stack Overflow用户

发布于 2016-10-10 18:55:24

这是我正在使用的一个工作版本:

代码语言:javascript
运行
复制
var jsZip = require('jszip')
jsZip.loadAsync(file).then(function (zip) {
  Object.keys(zip.files).forEach(function (filename) {
    zip.files[filename].async('string').then(function (fileData) {
      console.log(fileData) // These are your file contents      
    })
  })
})

您可以从http://stuk.github.io/jszip/documentation/examples.html获得所需的大部分信息,但是要在一个地方获得它有点困难,您必须四处看看。

票数 27
EN

Stack Overflow用户

发布于 2019-07-23 09:57:44

这个答案是cordova-plugin-file特有的。

文档所述

目录条目必须连续创建。例如,如果fs.root.getDirectory不存在,调用dir1 (‘did /did 2’,{create:true},successCallback,errorCallback)将失败。

我几乎可以肯定,当前接受的答案不能保证始终以相同的顺序检索文件内容/文件夹。这可能会导致API (如cordova-plugin-file )出现问题。特别是当您调用另一个异步函数异步创建文件系统上的目录时。

您可能需要先过滤zip归档中的目录,然后以同步方式创建它们,然后再继续提取其他已回答的文件:

代码语言:javascript
运行
复制
const directoryNames = Object.keys(zip.files).filter(name => zip.files[name].dir);
for (const directoryName of directoryNames) {
    await this.createDirectory(directoryName, dirEntry);
}
// ...

private createDirectory = (dirName: string, dirEntry: DirectoryEntry) => {
    const promise = new Promise<DirectoryEntry>(resolve, reject) => {
        dirEntry.getDirectory(dirName, { create: true }, dirEntry => {
            resolve(dirEntry);
        }, fileError => reject(fileError));
    });
    return promise;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39322964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档