使用 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 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

使用 NodeJS 中的特定路径将文件上传到 AWS S3

从带有文件系统的 AWS S3 下载的 Laravel 文件已损坏

使用nodejs AWS lambda从S3加载并解析yaml文件

带有 Android Retrofit V2 库的 AWS S3 Rest API,上传的图像已损坏

awss3图片损坏如何显示

使用nodejs中的AWS Lambda函数上传音频文件