【发布时间】: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 编码的。