我在使用JWT令牌验证后从nodejs API获取图像。 我在浏览器中获得GET 200 ok响应网络标题和图片可以在预览中看到,但我无法在我的应用程序中使用它。
我肯定做错了什么。请让我知道从API显示图像的正确方法。 在我的后端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>
);
}
}
答案 0 :(得分:2)
我能够使用类似的模式使用react hooks
,axios
和URL.createObjectURL
来渲染来自React后端调用的图像
我使用了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} />
})
}
[编辑]:如果您的api是受保护的路由,只需确保您的axios http客户端已经使用令牌初始化了
答案 1 :(得分:1)
这是我经过验证的获取数据的方法,有一个与承诺相关的原因我无法解释你需要第二个。然后函数:
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.log( JSON.parse(data) )
this.setState{( pic: JSON.parse(data) )}
})
}
然后在你的img中
src={ this.state.pic }
答案 2 :(得分:0)
我找到了答案。这是:
答案 3 :(得分:0)
var viewer = $wnd.OpenSeadragon({
element: where,
showRotationControl: true,
prefixUrl: "scripts/openseadragon-bin-2.4.2/images/",
tileSources: ressource,
});
viewer.addHandler("pre-full-page", function (data) {
data.preventDefaultAction=true;
openFullscreen();
});
function openFullscreen() {
if (where.requestFullscreen) {
where.requestFullscreen();
} else if (where.mozRequestFullScreen) {
where.mozRequestFullScreen();
} else if (where.webkitRequestFullscreen) {
where.webkitRequestFullscreen();
} else if (where.msRequestFullscreen) {
where.msRequestFullscreen();
}
}
然后在html或jsx文件中的image标签中,您可以按以下步骤进行操作:
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.log("error", error));
res = await response.blob();