我正在使用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);
}
});
}
});
答案 0 :(得分:4)
您从data
返回的readFile
变量已经很好了。直接用Body: data
传递它。完全丢弃ContentEncoding
参数,因为您没有发送base64数据。