【问题标题】:ReactJS Axios Image RequestReactJS Axios 图片请求
【发布时间】:2020-01-29 06:03:35
【问题描述】:

我想向 API 发出请求,其标头具有 UserID:Pass

例子:

const config = {
  headers: {
    'X-RPC-DIRECTORY': 'main',
    'X-RPC-AUTHORIZATION': 'userid:pass'
  }
};

const res = await axios.get(`http://192.00.00.60:8000/obj/e1b8c19e-fe8c-43af-800c-c9400c0e90/abc.jpg`, config );

如何渲染这个? 使用相同的方法我可以在 Postman 中获取图像,但我想将其渲染到页面中。

【问题讨论】:

  • 你有 api / 想访问你的图片 url ???
  • 我想渲染这个 jpg,但是当我直接使用这个链接时,它会显示:{“message”:“无法创建客户端凭据”,“errorReason”:“MissingCredentials”,错误":"MissingCredentialException","path":"/obj/e1b8c19e-fe8c-43af-800c-30c9400c0e90/cutout.jpg","verb":"GET","status":401,"timestamp":1580278417361}
  • @PrakashKarena 确切地说,我有 API 和图像 URL,我只想从 API 访问该图像 URL,但它需要授权才能访问,问题是我不知道如何。

标签: javascript reactjs axios


【解决方案1】:

1- 创建 useState 以保存您的 base64 数据。

const [base64, setBase64] = useState();

2- 创建 useEffectfunction 将图像从 get 请求转换为 base64

useEffect(() => {
    axios
      .get(
        url,
        {
          responseType: "arraybuffer",
        }
      )
      .then((response) =>
        setBase64(Buffer.from(response.data, "binary").toString("base64"))
      );
  }, []);

3-根据data URI scheme的语法将base64数据显示为图像:

<img src={data:[<media type>][;charset=<character set>][;base64],<data>} />

示例:

<img src={`data:image/jpeg;charset=utf-8;base64,${base64}`} />

【讨论】:

    【解决方案2】:
    axios({
            method:'get',
            url,
            auth: {
                username: 'xxxxxxxxxxxxx',
                password: 'xxxxxxxxxxxxx'
            }
        })
        .then((response) => {
    
            //From here you can pass the response to local variable(state) and store/show image. 
    
           this.setState({ imageURL : response.data.image }); // change this as per your response 
    
        })
        .catch((error) => {
            console.log(error);
        });
    
    render(){
    return(
      <React.Fragment>
       <img src={this.state.imageURL} alt="image" />
      </React.Fragment>
    )
    }
    

    确保您有正确的方法类型、URL 和响应数据。

    【讨论】:

    • 我得到的响应不是图像 url,而是它的数据,所以,当我将该数据保存为邮递员的 .jpg 时,它就是我想要的图像,我的问题是:如何我可以将(数据/响应)呈现为图像,因为它不是图像 url 它的数据。 (我已经添加了截图)
    • 如果数据是base64的,可以试试这种方式。 data:image/jpeg;base64,${this.state.image}} />
    • 这是我得到的:- GET data:image/jpeg;base64,{props.getImage.firstImage} net::ERR_INVALID_URL
    • 为什么要通过props渲染?您有来自 API 的响应,您将该响应存储在一个本地组件的状态中并通过相同的状态呈现。
    • 因为我使用 redux 作为状态,props.getImage.firstImage 包含:{ data, status, statusText, headers, config, request}
    【解决方案3】:

    得到了解决方案,因为响应是 content-type: blob 所以,我所做的就是将 blob 从 FileReader api 转换为 base64,然后显示它。

    const fileReaderInstance = new FileReader();
     fileReaderInstance.readAsDataURL(blob); 
     fileReaderInstance.onload = () => {
         base64data = fileReaderInstance.result;                
         console.log(base64data);
     }
    

    【讨论】:

      【解决方案4】:
      class Hello extends Component {
        state = {
          ulr: ''
        }
        componentDidMount() {
            const config = {
            headers: {
            'X-RPC-DIRECTORY': 'main',
            'X-RPC-AUTHORIZATION': 'userid:pass'
            }
          };
      
        axios.get(`http://192.00.00.60:8000/obj/e1b8c19e-fe8c-43af-800c-c9400c0e90/abc.jpg`, config ).then((response) => {
          this.setState({ url: response.data })
        }).catch((error) => {
          console.log(error)
        })
        }
        render() {
          return (
            <>
              <img src={this.state.url} alt="#" />
            </>
          )
        }
      }
      
      export default Hello;
      

      这应该回答如何在从 API 获取图像后渲染图像。 但我认为 URL 有问题。 我有几个问题:

      1. 后端 API 是否托管在我们自己的系统上?
      2. API 是否公开可用,否则我们无法访问它。
      3. 您是否设置了其他需要随请求发送的标头或参数。
      4. 我尝试使用邮递员也没有得到图像响应,它给了我错误。

      【讨论】:

      • 是托管在本地系统上的后端 API,要访问它,我们需要 header -> { 'X-RPC-AUTHORIZATION': 'userid:pass' } - 但问题是响应是数据不是图像 url,这意味着当我将数据(响应)保存为邮递员的 .jpg 文件时,它就可以工作了,所以,我的问题是:我怎样才能将(数据/响应)呈现为图像。跨度>
      • @SRTechConnect 因为我无法访问 API,因为它不是公开可用的,您能否通过此处获得的响应。我有点困惑,您是否期望 API 响应中的该图像的资源 URL 或图像的内容字节?
      • 我想你可能会收到图像的内容字节数据让我看看响应然后我可以提出一个可能的解决方案。
      • @PrasanKumar - 请检查添加的响应屏幕截图
      • @SRTechConnect 问题不在反应方面。我看到的是您没有以正确的方式将图像存储在数据库中。我的建议是根本不将图像存储在数据库中。将它们存储在文件系统中的某个位置并在那里存储到数据库的相对路径。这样,您的数据库仍然很轻,您可以在 API 响应中发送图像的资源 URL。并将该资源 URL 放在 中。根据您在后端使用的堆栈,有很多文章可以帮助您正确执行此操作。
      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 2021-01-20
      • 2020-07-17
      • 2020-09-25
      • 2018-04-25
      • 2016-11-26
      • 2017-08-11
      • 1970-01-01
      相关资源
      最近更新 更多