Загрузка изображения в корзину 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.

Он по-прежнему не сохраняет фактическое изображение, но это уже другая проблема.

Другие вопросы по тегам