Corrupt/truncated 使用 NodeJS 和 AWS S3 将 mp4 上传到 S3 存储桶

Corrupt/truncated mp4 upload to S3 bucket using NodeJS and AWS S3

我正在使用 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); 
            }  
        });
    }
});

我尝试从参数对象中省略 ContentEncoding and/or ContentType 属性。

编辑:

因此,当我对 fs.readFile 返回的数据长度进行 console.log 计算时,它总是很短。我也没有意识到我实际上也没有在处理 base64 数据。因此,如果我在要求使用 base64 读取文件的地方使用以下代码,fs.readFile 中的 data.length 似乎是正确的,并且 mp4 文件显示在我的 S3 存储桶中,播放头位于浏览器(我之前没有得到),但视频无法播放并且是黑色的,所以它似乎仍然损坏。

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); 
            }  
        });
    }
});

您从 readFile 返回的 data 变量已经可以使用了。只需使用 Body: data 直接传递即可。完全删除 ContentEncoding 参数,因为您不发送 base64 数据。