Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中使用JSZIP提取压缩文件_Javascript_Unzip_Jszip - Fatal编程技术网

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

在javascript中使用JSZIP提取压缩文件,javascript,unzip,jszip,Javascript,Unzip,Jszip,在我的网页中,用户应该上传一个压缩文件。在压缩文件中有两个文件:另一个压缩文件和一个txt文件。在我的服务器上,收到zip后,我想解压缩zip文件以提取zip&txt文件,然后将这两个文件移动到预定义的文件夹中。我有一段提取zip文件的代码,但数据似乎不正确。首先,当只有一个txt文件时,它解压缩了一个zip和两个txt文件。它创建了一个额外的“未定义”txt文件。此外,在我的txt文件中,原始数据被替换为以下文本:“[undefined][undefined]” 有人能帮我吗?以下是我的代码:

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

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);
      });
    });
  }
});

在他们的文档中进行了一些挖掘,但是他们已经有了一个演示如何从ZIP读取文件内容的文档

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

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);
                });
            });
        });
    }
});

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

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      
    })
  })
})

您可以从中获得所需的大部分信息,但要在一个地方获得信息有点困难,您必须四处看看。

这个答案是针对
cordova插件文件的

如合同所述:

必须依次创建目录项。例如 调用fs.root.getDirectory('dir1/dir2',{create:true},successCallback, 如果dir1不存在,errorCallback)将失败

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

您可能希望先筛选zip存档的目录,并以同步方式创建它们,然后继续提取其他文件,如已回答的:

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;
}
const directoryNames=Object.keys(zip.files).filter(name=>zip.files[name].dir);
for(目录名的常量目录名){
等待这个.createDirectory(directoryName,dirEntry);
}
// ...
私有createDirectory=(dirName:string,dirEntry:DirectoryEntry)=>{
持续承诺=新承诺(解决、拒绝)=>{
getDirectory(dirName,{create:true},dirEntry=>{
解析(dirEntry);
},fileError=>拒绝(fileError));
});
回报承诺;
}

您好,谢谢您的回复。我试过了,但现在连拉链都拉不开。你试过了吗?它对你有用吗?我想这一行“zip.files(filename).async('nodebuffer')。然后(function(content){”。我打印了一个文件,但在这一行后面没有显示出来。..async('nodebuffer'))似乎是这个问题。我使用.async打印了一个文件,它会卡在那里。我已经尝试过了,它对我有效。你是否在node.js中运行这个文件(如果是,是什么版本)或者在浏览器中?哦,天哪,它工作了..但是我用zip.loadAsync代替了JSZip.loadAsync,在这么长时间后获得了下载投票-有什么需要更改吗?@webnoob我不知道你为什么获得下载投票,但是
.async('string'))
不适用于我的最新版本,我更喜欢这里的箭头函数。@YannicHamann您只需执行
.async('text')。然后((fileContents)=>{//do stuff with file contents});
变量文件在这里具体包含什么?@Karlsson这是一个来自HTML文件选择器的文件,即
e.target.files[0]
侦听表单元素上的更改事件时。