如何在 React.js 中显示从 API 检索到的二值图像?
How to display binary images retrieved from API in React.js?
✨大家好!✨
一般问题:
我有一个网络应用程序,其中包含大约 50 张图像,在用户登录该网站之前不应访问这些图像。我怀疑这应该是一个简单的答案,有很多网站也需要这种基本保护。也许我在这里不知道 google 的正确用词,但我遇到了一些麻烦。感谢任何帮助。
应用详情:
我的网络应用程序是用 typescript react 构建的,带有一个节点。js/express/mongoDB 后端。相当典型的东西。
我尝试过的:
到目前为止,我最好的想法是将它们上传到托管在 heroku 上的后端服务器上的 public 文件夹中。然后,我使用身份验证中间件将图像保护到任何包含“/images/”的 url。这部分有效。当我使用身份验证 header 从邮递员那里调用 api 时,我能够看到图像。但是我想不出一种方法来在我的反应网络应用程序中显示该图像。这是我使用的基本调用。
fetch(url,
{
headers: {
Authorization:token,
},
}
);
然后当我尝试复制它时,实际响应只是一个空 object
{}
但是当我控制台记录纯响应时我也得到了这个,某种可读流:
来自关注 related question
我想到了以下内容:(通常包含在 asyc 函数中)
const image = await fetch(url,{headers:{ Authorization:token}});
const theBlob = await image.blob();
console.log(URL.createObjectURL(theBlob));
这给了我 link: http://localhost:3000/b299feb8-6ee2-433d-bf05-05bce01516b3 只显示一个空白页。
非常感谢任何帮助!谢谢!
没错,您发送了身份验证令牌,后端使用它来对用户进行身份验证(检查他是否存在于数据库中,他是否具有正确的角色并检查 jwt)
如果以上为真,服务器仅响应图像
如果您的服务器正在响应一个空对象,那么问题出在后端而不是前端,console.log您发送到前端的内容
经过大量工作试图了解发生了什么,这是我自己的答案:
const image = await axios(url, { responseType: "blob", headers: {Authorization: token }});
const srcForImage = URL.createObjectURL(image.data)
为什么现在有意义
所以我不明白正在发生的事情的内部运作。请指正,以下是我的理解:
所以图像是以二进制形式发送的。我必须做的是将 axios 中的 reponseType 设置为“blob”,然后发送一个 blob,我相信这意味着它的 base 64 编码。然后函数 URL.createObjectURL 做了一些魔术,必须将它作为页面的一部分保存到浏览器。然后我们可以将其用作图像 url。当你自己访问它时,你必须也输入它给你的 url 的 'blob:' 部分,否则它是空白的,或者将它粘贴在 <img src={srcForImage}/>
中并且效果很好。我敢打赌它会在问题的原始提取示例中起作用,我只是从不将 url 放在标签中或将 'blob:' 作为 URL.[=12= 的一部分包含在内]
✨大家好!✨
一般问题:
我有一个网络应用程序,其中包含大约 50 张图像,在用户登录该网站之前不应访问这些图像。我怀疑这应该是一个简单的答案,有很多网站也需要这种基本保护。也许我在这里不知道 google 的正确用词,但我遇到了一些麻烦。感谢任何帮助。
应用详情:
我的网络应用程序是用 typescript react 构建的,带有一个节点。js/express/mongoDB 后端。相当典型的东西。
我尝试过的:
到目前为止,我最好的想法是将它们上传到托管在 heroku 上的后端服务器上的 public 文件夹中。然后,我使用身份验证中间件将图像保护到任何包含“/images/”的 url。这部分有效。当我使用身份验证 header 从邮递员那里调用 api 时,我能够看到图像。但是我想不出一种方法来在我的反应网络应用程序中显示该图像。这是我使用的基本调用。
fetch(url,
{
headers: {
Authorization:token,
},
}
);
然后当我尝试复制它时,实际响应只是一个空 object
{}
但是当我控制台记录纯响应时我也得到了这个,某种可读流:
来自关注 related question
我想到了以下内容:(通常包含在 asyc 函数中)
const image = await fetch(url,{headers:{ Authorization:token}});
const theBlob = await image.blob();
console.log(URL.createObjectURL(theBlob));
这给了我 link: http://localhost:3000/b299feb8-6ee2-433d-bf05-05bce01516b3 只显示一个空白页。
非常感谢任何帮助!谢谢!
没错,您发送了身份验证令牌,后端使用它来对用户进行身份验证(检查他是否存在于数据库中,他是否具有正确的角色并检查 jwt)
如果以上为真,服务器仅响应图像
如果您的服务器正在响应一个空对象,那么问题出在后端而不是前端,console.log您发送到前端的内容
经过大量工作试图了解发生了什么,这是我自己的答案:
const image = await axios(url, { responseType: "blob", headers: {Authorization: token }});
const srcForImage = URL.createObjectURL(image.data)
为什么现在有意义
所以我不明白正在发生的事情的内部运作。请指正,以下是我的理解:
所以图像是以二进制形式发送的。我必须做的是将 axios 中的 reponseType 设置为“blob”,然后发送一个 blob,我相信这意味着它的 base 64 编码。然后函数 URL.createObjectURL 做了一些魔术,必须将它作为页面的一部分保存到浏览器。然后我们可以将其用作图像 url。当你自己访问它时,你必须也输入它给你的 url 的 'blob:' 部分,否则它是空白的,或者将它粘贴在 <img src={srcForImage}/>
中并且效果很好。我敢打赌它会在问题的原始提取示例中起作用,我只是从不将 url 放在标签中或将 'blob:' 作为 URL.[=12= 的一部分包含在内]