使用 NodeJS 和 AWS S3 将损坏/截断的 mp4 上传到 S3 存储桶
Posted
技术标签:
【中文标题】使用 NodeJS 和 AWS S3 将损坏/截断的 mp4 上传到 S3 存储桶【英文标题】:Corrupt/truncated mp4 upload to S3 bucket using NodeJS and AWS S3 【发布时间】:2016-01-19 19:30:29 【问题描述】:我正在使用 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);
);
);
【问题讨论】:
磁盘上的文件实际上是用base64编码的吗?我对此表示高度怀疑。如果它是二进制格式的 mp4 并告诉节点读取它,就好像它是 base64 一样会导致损坏。只需从磁盘将其作为二进制文件读取,然后让亚马逊库将其作为二进制文件流式传输到 s3。当您将编码传递给fs.readFile
时说“此文件中的数据采用此编码”,它不会进行任何转换,因此如果该编码实际上不是真的,您将有损坏。
感谢您的支持,彼得。我不完全理解您所描述的根本不需要 base64 编码。我从一个教程中制作了我的尝试,该教程涉及提取实际上是 base64 编码的数据,但我的本地文件(当然)不是。现在工作正常。
@Gregir 你能帮帮我吗?我通过 nodejs 在 s3 上遇到了同样的文件损坏问题
【参考方案1】:
您从readFile
返回的data
变量已经可以使用了。只需使用Body: data
直接传递即可。完全删除 ContentEncoding
参数,因为您不发送 base64 数据。
【讨论】:
以上是关于使用 NodeJS 和 AWS S3 将损坏/截断的 mp4 上传到 S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章
从带有文件系统的 AWS S3 下载的 Laravel 文件已损坏
使用nodejs AWS lambda从S3加载并解析yaml文件