我无法通过FileReader
读取文件,并且无法通过PutObject
将其正确上传到S3,而文件没有损坏。
我一直在使用MongoDB Stitch作为我的应用程序的无服务器平台,并且它内置有S3服务提供商。我可以正确地上传文本文件,但是如果我尝试上传任何二进制文件(Excel,PDF,图像等)并直接从S3存储桶中下载并在其相应程序中打开,则我的计算机报告该文件已损坏。 / p>
我已经查看了这两个文件,它们是我计算机上的原始文件,另一个是上传到S3的文件,它们非常相似,但是似乎上传中的某些数据已更改。
我正在使用FileReader
打开读取流,并使用FileReader.readAsBinaryString()
读取文件。标头中的我的ContentType
通过.txt
设置为原始文件类型(例如,text/plain
,.jpg
,.jpeg
,File.type
)
我已经看到W3C建议使用FileReader.readAsArrayBuffer()
而不是readAsBinaryString()
,但是S3在尝试上传结果数据时报告错误:value for field "Body" should be of type "io.ReadSeeker"
。
我也尝试过FileReader.readAsDataURL()
,但是我不知道将 any 文件类型的base64 URL转换回其原始格式的方法。我能找到的唯一示例都涉及使用base64编码/解码图像。
const readFile = (file) => {
return new Promise((resolve) => {
const fileReader = new FileReader()
fileReader.onload = (event) => {
resolve(event.target.result)
}
fileReader.readAsBinaryString(file)
})
}
async s3Upload(file) {
const fileData = await readFile(file)
const putObjectArgs = {
Body: fileData,
Key: file.name,
ContentType: file.type,
ACL: 'public-read',
Bucket: 'BUCKET_NAME',
}
// call the Stitch services to upload
}
有没有一种方法可以将任何类型的文件上传到S3,就像存储在文件系统中一样?还是一种通用方法来将任何文件类型编码/解码到base64?/
答案 0 :(得分:0)
我找到了FilePond和类似的库,并且由于它支持任何类型的服务器上载,所以我决定使用它,而不是尝试自己创建文件上载逻辑。
更新:
甚至FilePond也可以让您定义自己的AWS上传逻辑...但是我终于弄清楚了。
使用MongoDB Stitch时,必须将ArrayBuffer转换为UInt8Array,然后使用其SDK转换为BSON Binary类型。这是代码:
const reader = new FileReader()
reader.onload = (e) => {
const fileData = new Uint8Array(reader.result)
const fileBson = new BSON.Binary(fileData)
// upload to S3
// ...
}
reader.readAsArrayBuffer(file)