使用NodeJS和AWS S3将损坏的mp4上传到S3存储桶

时间:2015-10-20 23:27:50

标签: node.js amazon-web-services amazon-s3 fs

我正在使用fs.readFile读取大约700KB的本地mp4文件,并使用AWS SDK将文件加载到我的S3存储桶中。该过程有效,但文件已损坏,可能被截断,因为S3上生成的文件大小仅为500KB左右。

我正在使用的代码适用于图像。只是不适用于mp4文件。这是我的代码:

fs.readFile(file_location, function (err, data) {
    if (err) { 
        console.log('fs error': err);
    } else {
        var base64data = new Buffer(data, 'binary');

        var params = {
            Bucket: config.settings.bucket, 
            Key: 'file.mp4', 
            Body: base64data,
            ContentEncoding: 'base64',
            ContentType: 'video/mp4'
        };

        s3.putObject(params, function(err, data) {
            if (err) { 
                console.log('Error putting object on S3: ', err); 
            } else { 
                console.log('Placed object on S3: ', object_key); 
            }  
        });
    }
});

我尝试从params对象中省略ContentEncoding和/或ContentType属性。

编辑:

因此,当我执行fs.readFile返回的数据长度的console.log时,它总是很短。我没有意识到我实际上也没有处理base64数据。因此,如果我使用以下代码,我要求使用base64读取文件,fs.readFile中的data.length看起来是正确的,并且在我的S3存储桶中显示一个mp4文件,其中有一个播放头在浏览器中(我之前没有得到),但视频不会播放&它是黑色的,所以它似乎仍然是腐败的。

fs.readFile(file_location, 'base64', function (err, data) {
    if (err) { 
        console.log('fs error': err);
    } else {
        var params = {
            Bucket: config.settings.bucket, 
            Key: 'file.mp4', 
            Body: data,
            ContentEncoding: 'base64',
            ContentType: 'video/mp4'
        };

        s3.putObject(params, function(err, data) {
            if (err) { 
                console.log('Error putting object on S3: ', err); 
            } else { 
                console.log('Placed object on S3: ', object_key); 
            }  
        });
    }
});

1 个答案:

答案 0 :(得分:4)

您从data返回的readFile变量已经很好了。直接用Body: data传递它。完全丢弃ContentEncoding参数,因为您没有发送base64数据。