Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 如何将数据块转换成新的缓冲区?_Javascript_Node.js_Meteor - Fatal编程技术网

Javascript 如何将数据块转换成新的缓冲区?

Javascript 如何将数据块转换成新的缓冲区?,javascript,node.js,meteor,Javascript,Node.js,Meteor,在NodeJS中,我有一个文件上传的数据块,该文件以部分形式保存。我想通过执行new Buffer()将其转换,然后将其上载到Amazon s3 如果只有一个块,这就行了,但当有多个块时,我就不知道如何创建新的缓冲区() 目前,我的解决方案是将数据块写入我自己服务器上的真实文件中,然后将该文件的路径发送到AmazonS3 如何跳过文件创建步骤并将缓冲区发送到Amazon s3?我想您需要使用streaming-s3 var streamingS3 = require('streaming-s3'

在NodeJS中,我有一个文件上传的数据块,该文件以部分形式保存。我想通过执行new Buffer()将其转换,然后将其上载到Amazon s3

如果只有一个块,这就行了,但当有多个块时,我就不知道如何创建新的缓冲区()

目前,我的解决方案是将数据块写入我自己服务器上的真实文件中,然后将该文件的路径发送到AmazonS3


如何跳过文件创建步骤并将缓冲区发送到Amazon s3?

我想您需要使用streaming-s3

var streamingS3 = require('streaming-s3');
var uploadFile = function (fileReadStream, awsHeader, cb) {

    //set options for the streaming module
    var options = {
        concurrentParts: 2,
        waitTime: 20000,
        retries: 2,
        maxPartSize: 10 * 1024 * 1024
    };
    //call stream function to upload the file to s3
    var uploader = new streamingS3(fileReadStream, aws.accessKey, aws.secretKey, awsHeader, options);
    //start uploading
    uploader.begin();// important if callback not provided.

    // handle these functions
    uploader.on('data', function (bytesRead) {
        console.log(bytesRead, ' bytes read.');
    });

    uploader.on('part', function (number) {
        console.log('Part ', number, ' uploaded.');
    });

    // All parts uploaded, but upload not yet acknowledged.
    uploader.on('uploaded', function (stats) {
        console.log('Upload stats: ', stats);
    });

    uploader.on('finished', function (response, stats) {
        console.log(response);
        cb(null, response);
    });

    uploader.on('error', function (err) {
        console.log('Upload error: ', err);
        cb(err);
    });

};

这并不能解决我的问题,因为AmazonS3的最小限制是5MB。我的数据块大小约为2MB。无论我是否使用这种方法,我仍然必须将我的块组合成至少5 MB的块。有没有一种方法可以将块组合成一个更大的块,或者用多个块创建一个缓冲区?我没能按你的要求做。我通过写磁盘解决了这个问题。然后通过获取文件大小,因为s3上传无法处理您提到的太小的流。如果文件大小小于1MB,我会再次将文件读回RAM,然后上传到S3。如果文件大小大于1MB,我将执行fs.readFile,并将生成的流作为二进制缓冲区上载到正文中,这对我来说很有效。我无法逃避在本地保存文件-但是,在本地保存并不是一件坏事,因为当您上载一个非常大的映像时,您的ec2实例可能会退出,并且内存不足