Загрузка изображения в корзину S3 сохраняет его как приложение / октет-поток, но я хочу сохранить его как изображение, чтобы использовать его (JavaScript / узел)
Я хочу, чтобы мои пользователи загружали изображения профиля. Прямо сейчас я могу выбрать файл и передать его в тело запроса POST. Я работаю в Node.js + JavaScript.
Я использую службу хранилища объектов Spaces от DigitalOcean для хранения своих изображений, которая совместима с S3.
В идеале в моем хранилище файл хранится как реальное изображение. Вместо этого он сохраняется как странный файл с Content-Type application / octet-stream. Я не знаю, как я должен с этим работать - обычно для отображения изображения я просто ссылаюсь на URL-адрес, на котором размещено изображение, но в этом случае URL-адрес указывает на этот странный файл. Он называется примерно так: VMEDFS3Q65JV4B7YQKLS (без расширения). Размер файла составляет 14 КБ, что кажется правильным и, похоже, содержит данные файла. Выглядит это так:
так далее...
Я знаю, что беру правильное изображение, и я знаю, что база данных подключена правильно, так как она отправляется точно в нужное место, я просто недоволен типом файла.
Запрос на фронтенд:
fetch('/api/image/profileUpload', {
method: 'PUT',
body: { file: event.target.files[0] },
'Content-Type': 'image/jpg',
})
Код в бэкэнде:
const AWS = require('aws-sdk')
let file = req.body;
file = JSON.stringify(file);
AWS.config.update({
region: 'nyc3',
accessKeyId: process.env.SPACES_KEY,
secretAccessKey: process.env.SPACES_SECRET,
});
const s3 = new AWS.S3({
endpoint: new AWS.Endpoint('nyc3.digitaloceanspaces.com')
});
const uploadParams = {
Bucket: process.env.SPACES_BUCKET,
Key: process.env.SPACES_KEY,
Body: file,
ACL: "public-read",
ResponseContentType: 'image/jpg'
};
s3.upload(uploadParams, function(err, data) {
if (err) console.log(err, err.stack);
else console.log(data);
});
Что я пробовал:
- Добавление заголовка типа содержимого в запрос и параметры типа содержимого сзади
- Другие методы получения данных в бэкэнде - все они приводят к одному и тому же
- Не преобразовывать файл после захвата его из req.body
- Изменение запроса POST на запрос PUT
Был бы признателен за любое понимание либо а) преобразования этого файла с октетным потоком в изображение, либо б) получения этого изображения для загрузки как изображения. Спасибо
1 ответ
Я несколько решил эту проблему - я изменил свои параметры на это:
const uploadParams = {
Bucket: 'oscarexpert',
Key: 'asdff',
Body: image,
ContentType: "image/jpeg",
ACL: "public-read",
};
^^ добавил ContentType.
Он по-прежнему не сохраняет фактическое изображение, но это уже другая проблема.