我正在使用以下代码使用预先签名的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);
文件已正确写入指定位置,但视频文件已损坏。当我尝试播放时,它不起作用。
是否有书面文件损坏的原因
我设法解决了这个问题。这是问题。问题是由于原始上传的文件(即视频)的编码为
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);