【问题标题】:why does a file written using writfFileSync method is corrupted for a video file in nodejs为什么使用readFileSync方法写入的文件对于nodejs中的视频文件已损坏
【发布时间】:2020-06-01 07:08:13
【问题描述】:

我正在使用以下代码使用预签名 URL 将视频文件上传到我的 s3 存储桶

function postsignedURL(req) {
   return new Promise(function (resolve, reject) {
       const params = {
          Bucket: 'bucket1',
          Expires: 60 * 60, // in seconds,
          Fields: {
             key: req,
             'Content-Type': 'video/'
          },
         Conditions: [
            ['content-length-range', 300, 4000e+7],
            { 'Content-Type': 'video/' },
            ["starts-with", "$Content-Type", "video/"]

        ]
    }
    s3.createPresignedPost(params, (err, data) => {
        if (err) {
            reject(err)
        } else {
            resolve(data);
        }
    })
})

}

我能够正确上传文件,甚至可以使用以下代码下载文件

 const video = await readObjectSignedUrl(key)
 console.log(video, " video ");

这个返回一个预签名的 url。我可以使用下面的 fetch 方法下载视频

 const objectResult = await fetchS3Object(video);
 const bufferType = Buffer.from(objectResult);
 const fileTypeResult = await fileType.fromBuffer(bufferTy[e);
 console.log(fileTypeResult )

fileTypeResult 的结果如下是正确的

{ ext: 'mov', mime: 'video/quicktime' }

fetchS3Object 的代码如下

async function fetchS3Object(key) {
   console.log(key," KEY ")
   const result = await fetch(key, {
       method: 'GET',
       mode: "cors",
       headers: {
         'Access-Control-Allow-Origin': '*',
       }
   })
   const response = await result.text()
   return response
}

当我打印 objectResult 变量时,它有些乱码。 我正在尝试使用 writeFileSync 方法将 objectResult 写入文件。

fs.writeFileSync('/tmp/file', objectResult);

文件已正确写入指定位置,但视频文件已损坏。当我尝试播放它时,它无法正常工作。

写入的文件损坏是否有原因

【问题讨论】:

  • 我不知道您尝试使用哪种类型的回复fetch(),但您可能需要使用res.text()res.json() 或类似的方式阅读正文。查看fetch() 的文档,了解如何获取正文内容。 fetch() 本身只是获取一个带有标头等的响应对象和一个准备好响应的流。然后,您需要一个额外的步骤来读取和解析传入流中的正文。
  • 很抱歉我没有包含正确的代码。我已经编辑了这个问题。事实上,我确实在 fetchS3Object 函数结束时应用了 .text()
  • 由于缺少缩进,无法很好地阅读您的fetchS3Object() 代码。
  • 我已经缩进了,请检查
  • 获取的内容应该是什么?您从回复中得到的content-type 是什么?它应该是文本/纯文本吗?如果它实际上是一个视频,那么它可能是 MIME 编码的。

标签: node.js fs


【解决方案1】:

我已经设法解决了这个问题。这是问题所在。问题是由于原始上传的视频文件的编码为

windows-1252, 

但是 fetch 方法返回一个用

编码的二进制文件
UTF-8.

因此,当您尝试使用 writeFileSync 时,输出是一个损坏的文件。 要解决这个问题,这是必须要做的。 fetchS3Object 函数要改成下面这样

async function fetchS3Object(key) {
   console.log(key," KEY ")
   const result = await fetch(key, {
      method: 'GET',
      mode: "cors",
      headers: {
          'Access-Control-Allow-Origin': '*',
      }
   })
   const response = await result.arrayBuffer();
   return response
}

然后

 const objectResult = await fetchS3Object(video);
 const bufferType = Buffer.from(objectResult);
 fs.writeFileSync('/tmp/file', bufferType);

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2019-06-03
    • 2020-05-19
    • 2019-01-09
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多