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