У меня проблемы с чтением файла через FileReader
и загрузкой его на S3 через PutObject
без повреждения файла.
Описание проблемы
Я был используя MongoDB Stitch в качестве моей серверной платформы с моим приложением, и оно поставляется встроенным с поставщиком услуг S3. Я могу правильно загрузить текстовые файлы, но если я попытаюсь загрузить любой двоичный файл (Excel, PDF, изображения и т. Д. c.) И загрузить его прямо из моего хранилища S3 и открыть его в соответствующей программе, мой компьютер сообщит об этом как поврежден.
Я просмотрел оба файла: исходный на моем компьютере и загруженный на S3, и они очень похожи, но, похоже, некоторые данные были изменены при загрузке.
Текущие попытки
Я использую FileReader
, чтобы открыть поток чтения, и FileReader.readAsBinaryString()
, чтобы прочитать файл. Мой ContentType
в заголовках установлен на исходный тип файла (например, для .txt
, text/plain
; для .jpg
, .jpeg
) через File.type
.
Я видел, что W3 C рекомендует использовать FileReader.readAsArrayBuffer()
вместо readAsBinaryString()
, но S3 сообщает об ошибке при попытке загрузить полученные данные: value for field "Body" should be of type "io.ReadSeeker"
.
Я также пытался FileReader.readAsDataURL()
, но я не знаю, как преобразовать 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 так же, как он хранится в моей файловой системе? или универсальный c метод для кодирования / декодирования любого типа файла в / из base64?