如何在node.js中使用JSZip生成zip文件并使用Buffer内容?

6
我有一个字符串数组需要写入.txt文件,同时我需要在客户端使用JSZip将生成的.txt文件压缩成.zip格式。但是在服务器端,我意识到在node.js中无法使用Blob。我尝试使用Buffer替代Blob,在得到一个二进制文件的同时也得到了一个压缩后的.zip文件;由于我是node.js的初学者,无法理解Buffer的概念。我是否可以在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实现相同的功能?

1
这段代码应该可以直接运行。如果JSZip文档中有Node的不同方法,可以参考一下。 - Brahma Dev
@BrahmaDev,我在node.js中遇到了“Blob未定义”的错误。 - HariV
1
抱歉,您需要使用缓冲区。此处的文档将是一个很好的研究点:https://stuk.github.io/jszip/documentation/api_jszip/generate_async.html - Brahma Dev
1个回答

12

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


我找到了解决方法。在我的代码中,我没有使用正确的方法将字符串数组转换为node.js缓冲区(因此我无法使用JSZip压缩缓冲区,因为缓冲区是不正确的)。我尝试了下面的代码,但它给出了一个错误的缓冲区:
//stringsArray is an array of strings
var buffer = Buffer.from( stringsArray );

正确的方法是,我们需要先将每个字符串转换为缓冲区,然后通过附加所有这些子缓冲区来创建一个新的缓冲区。我已经创建了一个自定义的缓冲区构建器,它会通过将字符串附加到其中来构建一个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

} );

输出为test.zip压缩文件和其中的test.txt文件。 在zip文件中的test.txt文件中包含以下文字:'hello world.\nThis is a test.'。

感谢@BrahmaDev花费时间查看我的问题 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接