为什么使用writfFileSync方法写入的文件在nodejs中的视频文件损坏了

问题描述 投票:0回答:1

我正在使用以下代码使用预先签名的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。我可以使用下面的提取方法下载视频]

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

文件已正确写入指定位置,但视频文件已损坏。当我尝试播放时,它不起作用。

是否有书面文件损坏的原因

node.js fs
1个回答
0
投票

我设法解决了这个问题。这是问题。问题是由于原始上传的文件(即视频)的编码为

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);
© www.soinside.com 2019 - 2024. All rights reserved.