Я пытаюсь визуализировать <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 ... > }
Спасибо за комментарий. Итак, responseType: 'blob' - это неправильный способ установки типа контента?
@TravisJ Вопрос, который вы связали, похоже, касается исключительно Node.js, если я чего-то не упускаю?
Он в первую очередь нацелен на Node.js (который вы также отметили здесь), однако основная причина, по которой я связал этот дубликат, заключается в том, что responseType не является правильным способом установки типа контента, вам необходимо указать contentType в заголовке запроса, который покрывает дубликат.
Настройка contentType на image/jpeg в getImageBlob(), похоже, не работает. Должен ли он быть установлен на application/json?
Хм, ответный blob должен быть image / jpeg (я думаю, для этого типа). Что ж, если дубликат не решит проблему, я открою его заново.
Я пытался исправить это с тех пор, как был опубликован вопрос, и, похоже, я не могу разобрать работоспособное решение из вопроса, который вы опубликовали, - тем более, что вы упомянули, что сервер, похоже, правильно возвращает данные. На всякий случай обновлю серверным кодом.
При выполнении getObject () из S3 API, согласно документации, содержимое вашего файла находится в свойстве Body. вы можете добавить результат журнала консоли сервера?
@Rubelhasan, конечно, обновленный вопрос.
@Rubelhasan Я пробовал это до того, как вы удалили свой ответ, но он по-прежнему не работает, и теперь объект Blob имеет только размер 2.
хорошо, вы удалили эту кодовую базу console.info(imageBlob); const urlCreator = window.URL || window.webkitURL; const imageUrl = urlCreator.createObjectURL(imageBlob); console.info(imageUrl); во внешнем интерфейсе?
@Rubelhasan Ага, не повезло - просто загружается намного дольше и все равно не работает :(
@Colin Я думаю, вам нужно создать новый буфер из data.Body. new Buffer(data.Body).toString('binary');. и удалите window.webkitURL во внешнем интерфейсе.
Позвольте нам продолжить обсуждение в чате.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Думаю дело в том, что вместо Blob(5842218) {size: 5842218, type: "application/json"} стоит Blob(5842218) {size: 5842218, type: "image/jpeg"} поменять тип
Проблема в вашем типе контента. По размеру большого двоичного объекта видно, что сервер выполняет свою часть работы правильно, просто на вашей стороне клиента возникают проблемы. Я считаю, что этот дубликат решает проблему обслуживания изображения.