Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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在node.js中使用缓冲区内容生成zip文件?_Javascript_Node.js_Zip_Jszip - Fatal编程技术网

Javascript 如何使用JSZip在node.js中使用缓冲区内容生成zip文件?

Javascript 如何使用JSZip在node.js中使用缓冲区内容生成zip文件?,javascript,node.js,zip,jszip,Javascript,Node.js,Zip,Jszip,我有一个字符串数组,应该写入.txt文件。我还需要使用JSZip将生成的.txt文件压缩为.zip格式。在客户端,我能够使用这个字符串数组生成一个“text/plain”Blob,然后使用JSZip将这个Blob压缩为.zip格式。我需要在服务器端使用node.js执行同样的操作,但我意识到node.js中没有Blob。我试着用“Buffer”代替Blob,得到了一个压缩为.zip的二进制文件;我是node.js的初学者,无法理解缓冲区的概念。我可以在node.js中创建Blob吗?或者我可以对

我有一个字符串数组,应该写入.txt文件。我还需要使用JSZip将生成的.txt文件压缩为.zip格式。在客户端,我能够使用这个字符串数组生成一个“text/plain”Blob,然后使用JSZip将这个Blob压缩为.zip格式。我需要在服务器端使用node.js执行同样的操作,但我意识到node.js中没有Blob。我试着用“Buffer”代替Blob,得到了一个压缩为.zip的二进制文件;我是node.js的初学者,无法理解缓冲区的概念。我可以在node.js中创建Blob吗?或者我可以对node.js Buffer执行相同的操作吗

在客户端,我可以从Blob内容生成zip文件,如下所示

//stringsArray is an array of strings
var blob = new Blob( stringsArray, { type: "text/plain" } );

var zip = new JSZip();
zip.file( 'file.txt' , blob );

zip.generateAsync( { type: 'blob', compression: 'DEFLATE' } )
.then( function( zipFile ){ 

    //do something with zipFile 

}, function( error ){ 

    console.log( 'Error in compression' );

} );

如何使用Node.js实现同样的功能?

我找到了解决方案。在我的代码中,我没有使用正确的方法将字符串数组转换为node.js buffer(我无法使用JSZip压缩缓冲区,因为缓冲区不正确)。 我尝试了以下代码,但它给了我一个不正确的缓冲区

//stringsArray is an array of strings
var buffer = Buffer.from( stringsArray );
正确的方法是,我们必须首先将每个字符串转换为缓冲区,然后通过附加所有这些子缓冲区来创建一个新的缓冲区。我创建了一个自定义缓冲区生成器,它将通过向node.js缓冲区添加字符串来构建一个node.js缓冲区。以下是我尝试过的新方法,它对我有效

var CustomBufferBuilder = function() {

    this.parts = [];
    this.totalLength = 0;

}

CustomBufferBuilder.prototype.append = function( part ) {

    var tempBuffer = Buffer.from( part );
    this.parts.push( tempBuffer );
    this.totalLength += tempBuffer.length;
    this.buffer = undefined;

};

CustomBufferBuilder.prototype.getBuffer = function() {

    if ( !this.buffer ) {

       this.buffer = Buffer.concat( this.parts, this.totalLength );

    }
    return this.buffer;

};


var customBufferBuilder = new CustomBufferBuilder();
var stringsArray = [ 'hello ', 'world.', '\nThis ', 'is', ' a ', 'test.' ];//stringsArray is an array of strings
var len = stringsArray.length;
for( var i = 0; i< len; i++ ){

    customBufferBuilder.append( stringsArray[ i ] );

}

var bufferContent = customBufferBuilder.getBuffer();

var zip = new JSZip();
zip.file( 'test.txt', bufferContent, { binary : true } );
zip.generateAsync( { type : "nodebuffer", compression: 'DEFLATE' } )
.then( function callback( buffer ) {

    fs.writeFile( 'test.zip', buffer, function( err ){

        if( err ){

            //tasks to perform in case of error

        }
        else{

            //other logic

        }

    } );

}, function( e ) {

    //tasks to perform in case of error

} );
var CustomBufferBuilder=function(){
此参数为.parts=[];
此值为0.totalLength=0;
}
CustomBufferBuilder.prototype.append=函数(部分){
var tempBuffer=Buffer.from(部分);
这个。零件。推送(临时缓冲);
this.totalLength+=tempBuffer.length;
this.buffer=未定义;
};
CustomBufferBuilder.prototype.getBuffer=函数(){
如果(!this.buffer){
this.buffer=buffer.concat(this.parts,this.totalength);
}
返回此.buffer;
};
var customBufferBuilder=新的customBufferBuilder();
var stringsArray=['你好','世界','\n这个','是','一个','测试']//stringsArray是字符串数组
var len=stringsArray.length;
对于(变量i=0;i
作为输出,我得到了zip文件(test.zip)和test.txt。 zip文件中的test.txt文件包含以下单词:, “你好,世界。\n这是一个测试。”


感谢@BrahmaDev花时间研究我的问题:)

我找到了解决办法。在我的代码中,我没有使用正确的方法将字符串数组转换为node.js buffer(我无法使用JSZip压缩缓冲区,因为缓冲区不正确)。 我尝试了以下代码,但它给了我一个不正确的缓冲区

//stringsArray is an array of strings
var buffer = Buffer.from( stringsArray );
正确的方法是,我们必须首先将每个字符串转换为缓冲区,然后通过附加所有这些子缓冲区来创建一个新的缓冲区。我创建了一个自定义缓冲区生成器,它将通过向node.js缓冲区添加字符串来构建一个node.js缓冲区。以下是我尝试过的新方法,它对我有效

var CustomBufferBuilder = function() {

    this.parts = [];
    this.totalLength = 0;

}

CustomBufferBuilder.prototype.append = function( part ) {

    var tempBuffer = Buffer.from( part );
    this.parts.push( tempBuffer );
    this.totalLength += tempBuffer.length;
    this.buffer = undefined;

};

CustomBufferBuilder.prototype.getBuffer = function() {

    if ( !this.buffer ) {

       this.buffer = Buffer.concat( this.parts, this.totalLength );

    }
    return this.buffer;

};


var customBufferBuilder = new CustomBufferBuilder();
var stringsArray = [ 'hello ', 'world.', '\nThis ', 'is', ' a ', 'test.' ];//stringsArray is an array of strings
var len = stringsArray.length;
for( var i = 0; i< len; i++ ){

    customBufferBuilder.append( stringsArray[ i ] );

}

var bufferContent = customBufferBuilder.getBuffer();

var zip = new JSZip();
zip.file( 'test.txt', bufferContent, { binary : true } );
zip.generateAsync( { type : "nodebuffer", compression: 'DEFLATE' } )
.then( function callback( buffer ) {

    fs.writeFile( 'test.zip', buffer, function( err ){

        if( err ){

            //tasks to perform in case of error

        }
        else{

            //other logic

        }

    } );

}, function( e ) {

    //tasks to perform in case of error

} );
var CustomBufferBuilder=function(){
此参数为.parts=[];
此值为0.totalLength=0;
}
CustomBufferBuilder.prototype.append=函数(部分){
var tempBuffer=Buffer.from(部分);
这个。零件。推送(临时缓冲);
this.totalLength+=tempBuffer.length;
this.buffer=未定义;
};
CustomBufferBuilder.prototype.getBuffer=函数(){
如果(!this.buffer){
this.buffer=buffer.concat(this.parts,this.totalength);
}
返回此.buffer;
};
var customBufferBuilder=新的customBufferBuilder();
var stringsArray=['你好','世界','\n这个','是','一个','测试']//stringsArray是字符串数组
var len=stringsArray.length;
对于(变量i=0;i
作为输出,我得到了zip文件(test.zip)和test.txt。 zip文件中的test.txt文件包含以下单词:, “你好,世界。\n这是一个测试。”


感谢@BrahmaDev花时间研究我的问题:)

这段代码应该按原样运行。如果他们对Node有不同的方法,也许可以检查JSZip的文档。@BrahmaDev,我在Node.js中发现了“Blob未定义”错误。很抱歉,您必须使用缓冲区。文档将是围绕这一点进行研究的好地方:这段代码应该按原样运行。如果他们对Node有不同的方法,也许可以检查JSZip的文档。@BrahmaDev,我在Node.js中发现了“Blob未定义”错误。很抱歉,您必须使用缓冲区。文件将是围绕以下内容进行研究的一个很好的切入点: