Как получить изображение в Reactjs из API?

Я получаю изображение из API nodejs после проверки с помощью токена JWT. Я получаю ответ GET 200 ok в заголовке сети браузера, и изображение можно увидеть в предварительном просмотре, но я не могу использовать его в своем приложении.

Я точно делаю что-то не так. Пожалуйста, дайте мне знать, как правильно отображать изображение из API. На моем backend nodejs я использую res.sendFile для отправки файла.

class Card extends Component {
 constructor({props, pic, token}) {
super(props, pic, token);
this.state = { 
  pic: pic,
};

urlFetch(data) {
 fetch(data, { 
 headers: new Headers({
 'authorization': `Bearer ${this.props.token}`, 
 'Content-Type': 'application/json'
 })
})
.then(response => {
 if (response.statusText === 'OK') {
  return data   // OR return response.url
  }
 })
}

render() {
const { pic } = this.state;

 return (
        <div>
          <img style = {{width: 175, height: 175}} className='tc br3' alt='none' src = { this.urlFetch(pic) } />
        </div>
       );
      }
     }
src = { pic } должен работать.
hurricane 15.05.2018 09:00

@hurricane не будет. Нет связи между полученным изображением и свойством состояния pic. setState не происходит в обратном вызове urlFetch

Ajay 15.05.2018 09:02

@hurricane Как я уже упоминал, я использую JasonWebToken на моем сервере для ПОЛУЧЕНИЯ изображений.

JKhan 15.05.2018 09:05

API возвращает URL-адрес изображения или сам файл изображения?

roxxypoxxy 15.05.2018 11:03

@roxxypoxxy Я вижу изображение в сети браузера -> предварительный просмотр. Я возвращаю URL-адрес изображения в своей выборке, только если авторизация с помощью бэкэнда прошла успешно.

JKhan 15.05.2018 11:13

В своем вопросе вы говорите On my backend nodejs, I am using res.sendFile to send the file, поэтому непонятно, какие данные возвращаются с сервера. Если это json, было бы полезно, если бы вы показали нам ответ с сервера.

roxxypoxxy 15.05.2018 11:19

Внутренний сервер @roxxypoxxy отправляет только файл изображения.

JKhan 15.05.2018 12:09

Хорошо. Думаю, этот пост stackoverflow.com/questions/20035615/… может решить вашу проблему.

roxxypoxxy 15.05.2018 12:28

@roxxypoxxy я опубликовал ответ

JKhan 15.05.2018 12:35
Поведение ключевого слова "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) для оценки ваших знаний,...
3
9
19 173
4

Ответы 4

Это мой проверенный и проверенный метод получения данных:

componentDidMount(){
    fetch('https://www.yoursite.com/api/etc', {
      method: 'GET',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
    })
    .then((response) => {
      return response.text();
    })
    .then((data) => {
      console.info( JSON.parse(data) )
      this.setState{( pic: JSON.parse(data) )}
    })
}

Тогда в вашем img

src = { this.state.pic }

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

JKhan 15.05.2018 09:15

пробовали ли вы this.setState {(pic: data)} в своем методе выборки, а затем src = {this.state.pic}?

Pixelomo 15.05.2018 09:36

тогда как мне вызвать функцию для запроса изображения с помощью токена?

JKhan 15.05.2018 09:40

Я обычно делаю это в componentDidMount

Pixelomo 15.05.2018 09:58

вместо response.text и parse мы также можем сделать это .then ((response) => {return response.json ()}) .then ((data) => {console.info ("ответ" + data )})

msanjay 17.05.2021 12:24

Я нашел ответ. Вот:

Работа с Fetch API - Google docs

Мне удалось визуализировать изображения из бэкэнд-вызова в React, используя шаблон, похожий на этот, используя: react hooks, axios и URL.createObjectURL.

Я использовал метод URL.createObjectURL(blob) и использовал конфигурацию axios { responseType: 'blob' }, чтобы убедиться, что тип данных подходит.

const ImageComponent = (imageIds) => {
  const [images, setImages] = React.useState([])

  React.useEffect(() => {
    async function getImage (id) {
      let imageBlob
      try {
        imageBlob = (await axiosClient.get(`/api/image/${id}`, { responseType: 'blob' })).data
      } catch (err) {
        return null
      }
      return URL.createObjectURL(imageBlob)
    }
    async function getImages () {
      const imageArray = []
      for (const id of imageIds) {
        imageArray.push(await getImage(id))
      }
      setImages(imageArray)
    }

    getImages()
  }, [imageIds])

  return images.map((img, i) => {
    return <img src = {img} alt = {`image-${i}`} key = {i} />
  })
}

[Edit]: Если ваш api является защищенным маршрутом, просто убедитесь, что ваш http-клиент axios уже инициализирован токеном

 var myHeaders = new Headers();
 myHeaders.append("response", "image/jpeg");
 myHeaders.append("psId", "");
 myHeaders.append("x-api-key", "Z7dwTzHQrklCh7bvSWqhNrDTPZiLblYS");
 myHeaders.append(
    "Authorization",
    "Bearer token"
 );

var raw = "";

var requestOptions = {
  method: "GET",
  headers: myHeaders,
  //body: raw,
  redirect: "follow",
};
let response = await fetch(
  "YourURL",
  requestOptions
)
.then((response) => response)
.then((result) => result)
.catch((error) => console.info("error", error));

 res = await response.blob();

Затем в теге изображения в вашем html или jsx файле вы можете сделать это следующим образом:

 <img src = {window.webkitURL.createObjectURL(res)} />

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