Правильная рендеринг изображения Blob

Я пытаюсь визуализировать <img> из капли.

import React from 'react';
import { getImageBlob } from '../api/images';

class ImageViewer extends React.Component {
   state = {
     src: undefined,
     loading: true,
   }

  componentDidMount() {
    getImageBlob()
      .then((imageBlob) => {
        console.info(imageBlob);
        const urlCreator = window.URL || window.webkitURL;
        const imageUrl = urlCreator.createObjectURL(imageBlob);
        console.info(imageUrl);
        this.setState({ src: imageUrl, loading: false });
      })
      .catch((err) => {
        console.error(err);
        this.setState({ loading: false });
      });
  }

  render() {
    if (this.state.loading) {
      return 'loading';
    }

    return <img src = {this.state.src} height = {100} width = {100} />;
  }
}


export default ImageViewer;

Вывод первого console.info() выглядит примерно так:

Blob(5842218) {size: 5842218, type: "application/json"}

Я думаю, что type может быть причиной того, что он не рендеринг, но я не уверен.

Выход второго console.info() выглядит примерно так:

blob:http://localhost:3000/12bfba06-388d-48e2-8281-5ada40a662de

Функция getImageBlob():

export const getImageBlob = () => new Promise((res, rej) => {
  client
    .get(`${IMAGES}`, {
      responseType: 'blob',
    })
    .then((resp) => {
      res(resp.data);
    })
    .catch((err) => {
      rej(Error(err.message));
    });
});

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

обновлен кодом сервера

Это код, который отправляет обратно изображение.

const getImage = (imageKey) => {
  const params = {
    Bucket: process.env.S3_BUCKET,
    Key: imageKey,
  };

  return new Promise((res, rej) => {
    s3.getObject(params, (err, data) => {
      if (err) {
        rej(Error(err.message));
      } else {
        console.info(data);
        res(data);
      }
    });
  });
};

Вывод console.info() на стороне сервера:

{ AcceptRanges: 'bytes',
  LastModified: 2018-08-18T18:07:39.000Z,
  ContentLength: 2101981,
  ETag: '"be594978d48fdc5964eb97ffb2c589f1"',
  ContentEncoding: 'blob',
  ContentType: 'image/jpg',
  Metadata: {},
  Body:
   <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 27 10 00 00 27 10 08 06 00 00 00 ba 4e 62 27 00 00 20 00 49 44 41 54 78 5e ec d0 01 0d 00 30 08 ... > }

Проблема в вашем типе контента. По размеру большого двоичного объекта видно, что сервер выполняет свою часть работы правильно, просто на вашей стороне клиента возникают проблемы. Я считаю, что этот дубликат решает проблему обслуживания изображения.

Travis J 18.08.2018 20:55

Спасибо за комментарий. Итак, responseType: 'blob' - это неправильный способ установки типа контента?

Colin Ricardo 18.08.2018 20:57

@TravisJ Вопрос, который вы связали, похоже, касается исключительно Node.js, если я чего-то не упускаю?

Colin Ricardo 18.08.2018 20:59

Он в первую очередь нацелен на Node.js (который вы также отметили здесь), однако основная причина, по которой я связал этот дубликат, заключается в том, что responseType не является правильным способом установки типа контента, вам необходимо указать contentType в заголовке запроса, который покрывает дубликат.

Travis J 18.08.2018 21:37

Настройка contentType на image/jpeg в getImageBlob(), похоже, не работает. Должен ли он быть установлен на application/json?

Colin Ricardo 18.08.2018 21:39

Хм, ответный blob должен быть image / jpeg (я думаю, для этого типа). Что ж, если дубликат не решит проблему, я открою его заново.

Travis J 18.08.2018 21:43

Я пытался исправить это с тех пор, как был опубликован вопрос, и, похоже, я не могу разобрать работоспособное решение из вопроса, который вы опубликовали, - тем более, что вы упомянули, что сервер, похоже, правильно возвращает данные. На всякий случай обновлю серверным кодом.

Colin Ricardo 18.08.2018 21:44

При выполнении getObject () из S3 API, согласно документации, содержимое вашего файла находится в свойстве Body. вы можете добавить результат журнала консоли сервера?

Rubel hasan 18.08.2018 22:11

@Rubelhasan, конечно, обновленный вопрос.

Colin Ricardo 18.08.2018 22:13

@Rubelhasan Я пробовал это до того, как вы удалили свой ответ, но он по-прежнему не работает, и теперь объект Blob имеет только размер 2.

Colin Ricardo 18.08.2018 22:21

хорошо, вы удалили эту кодовую базу console.info(imageBlob); const urlCreator = window.URL || window.webkitURL; const imageUrl = urlCreator.createObjectURL(imageBlob); console.info(imageUrl); во внешнем интерфейсе?

Rubel hasan 18.08.2018 22:24

@Rubelhasan Ага, не повезло - просто загружается намного дольше и все равно не работает :(

Colin Ricardo 18.08.2018 22:26

@Colin Я думаю, вам нужно создать новый буфер из data.Body. new Buffer(data.Body).toString('binary');. и удалите window.webkitURL во внешнем интерфейсе.

Rubel hasan 18.08.2018 22:33

Позвольте нам продолжить обсуждение в чате.

Rubel hasan 18.08.2018 22:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
14
1 793
1

Ответы 1

Думаю дело в том, что вместо Blob(5842218) {size: 5842218, type: "application/json"} стоит Blob(5842218) {size: 5842218, type: "image/jpeg"} поменять тип

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