SAP B1, วิธีแสดงรูปภาพที่ดึงมาจาก ItemImage


10

ฉันดึงภาพจาก SAP B1 Service Layer ในบุรุษไปรษณีย์ฉันสามารถดูได้image/pngแต่มีปัญหาในการแสดง

วิธีที่ถูกต้องในการแสดงมัน<img />คืออะไร?

require(fetchedImage) - ไม่ทำงาน


ฉันได้สร้างฟังก์ชั่นคลาวด์เพื่อดึงภาพและส่งต่อไปยังลูกค้า แต่ฉันไม่แน่ใจว่าจะทำอย่างไร

มีวัตถุประหลาดสุด ๆ แบบนี้

 data:
>     '�PNGörönöu001aönöu0000öu0000öu0000örIHDRöu0000öu.........

ไม่ทราบวิธีส่งผ่านres.send(IMAGE IN PNG)เพื่อให้ฉันเห็นภาพบนฝั่งไคลเอ็นต์

ตรวจสอบbase64การแปลง แต่ฉันไม่แน่ใจว่าจะใช้มันอย่างไร


ปรับปรุง

คำขอบุรุษไปรษณีย์: (ทำงานได้ดี)

รับ: https://su05.consensusintl.net/b1s/v1/ItemImages ('ทดสอบ') / ค่า $

ส่วนหัว : SessionId: ถามฉันเมื่อคุณลอง

ด้วยเหตุผลบางอย่างเราไม่สามารถดึงภาพได้โดยตรงใน Front-End และจำเป็นต้องสร้างมิดเดิลแวร์ดังนั้นเราจึงกำลังทำมัน Firebase Cloud Function

นี่คือฟังก์ชั่นที่ดึงภาพและไม่รู้ว่าจะผ่านมันอย่างไร

นี่คือฟังก์ชั่นใน Firebase Cloud Function:

if (!req.body.productId) {
      res.status(400).send({ error: "productId is required" });
      return;
    }

    console.log("Starting the process");

    const productId = req.body.productId;

    const login = await Auth.login();
    const fetchedImg = await ItemMaster.getImage(login["SessionId"], productId);

    //Here in the fetchedImg, we're getting some data like
    res
      .status(200)
      .set("Content-Type", "image/png")
      .send(fetchedImg);

และเราได้รับคำตอบเช่นนี้:

{สถานะ: 200,

statusText: 'ตกลง',

ส่วนหัว:

{ server: 'nginx',

  date: 'Wed, 22 Jan 2020 03:52:22 GMT',

  'content-type': 'image/png',

  'transfer-encoding': 'chunked',

  connection: 'close',

  dataserviceversion: '3.0',

  'content-disposition': 'inline; filename="rr-96600.png"',

  vary: 'Accept-Encoding',

  'set-cookie': [ 'ROUTEID=.node2; path=/b1s' ] },

การตั้งค่า:

{ url:

ข้อมูล:

'PNG \ r \ n \ u001a \ n \ u0000 \ u0000 \ u0000 \ rIHDR \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ ข \ u0002 \ u0000 \ u0000 \ u0000 \ u0006 \ u001fS \ u0000 \ u0000 \ u0000 \ u0019tEXtSoftware \ u0000Adobe ImageReadyq e <\ u0000 \ u0000 \ u0003hiTXtXML: com.adobe.xmp \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000

นี่ยาวมากและใช้เวลามากกว่า 80-100 บรรทัด

หากคุณต้องการทดสอบคุณสามารถใช้สิ่งต่อไปนี้:

บุรุษไปรษณีย์:

POST: https://us-central1-rapid-replacement.cloudfunctions.net/getImageFromItems

เนื้อหา: {"productId": "test"}

รหัสผลิตภัณฑ์ที่ถูกต้องคือ: 1. "RR000102" 2. "ทดสอบ" 3. "RR000101"


1
คุณได้ตั้งค่าประเภทเนื้อหาในแบ็กเอนด์res.set({'Content-Type': 'image/png'});
C.Gochev

1
ใช่ฉันลองเช่นกันมันให้ภาพที่ไม่ดี
Dhaval Jardosh

1
คุณบันทึกไว้ที่ไหนสักแห่ง?
C.Gochev

1
ไม่ฉันไม่ได้มีวิธีที่จะทำได้โดยไม่ว่า?
Dhaval Jardosh

1
คุณสามารถมอบฉันทะโดยตรงconst request = require('request')และในเส้นทางrequest.get(url).pipe(res);
C.Gochev

คำตอบ:


4

หากคุณต้องการใช้ภาพแบบไดนามิกคุณต้องดึงภาพทันทีที่ติดตั้งส่วนประกอบแล้วใส่เข้าไปในภายหลัง รูปภาพที่ดึงมาควรจะถูกบันทึกไว้ในสถานะขององค์ประกอบและรวมจากที่นั่นใน src attrbut ของแท็ก img สมมติว่าคุณสามารถดึงภาพได้รหัสด้านล่างควรใช้งานได้

import React, { Component } from "react";

export default class ComponentWithFetchedImage extends Component {
  constructor() {
    super();
    this.state = { image: undefined };   
  }

  componentDidMount() {
    let fetch_url = "https://picsum.photos/200";   // Insert your fetch url here
    fetch(fetch_url)
      .then(res => res.blob())
      .then(blob => URL.createObjectURL(blob))
      .then(url => this.setState({ image: url }))
      .catch(err => console.log(err));
  }

  render() {
    return (
      <div className="component">
        <img src={this.state.image} alt="" />
      </div>
    );   
  }
}

1
ฉันไม่สามารถดึงข้อมูลได้โดยตรงใน ComponentDidMount เนื่องจากฉันจำเป็นต้องสร้างฟังก์ชั่นที่กำหนดเองบนฝั่งเซิร์ฟเวอร์และสำหรับสิ่งนั้นฉันทำผ่านฟังก์ชั่นคลาวด์
Dhaval Jardosh

1
มันไม่อนุญาตให้ฉันดึงข้อมูลจากฝั่งไคลเอ็นต์ แต่มันบอกว่าส่วนหัวที่ผิดกฎหมายถูกส่งผ่านในการดึงข้อมูล / axios เมื่อฉันทำจาก React
Dhaval Jardosh

3

นี่คือวิธีการแก้ปัญหาการทำงานที่ฉันใกล้ที่สุด โดยทั่วไปสิ่งที่ฉันพยายามคือดึงภาพแล้วเปลี่ยนเป็นหยดบนไคลเอนต์เพื่อให้คุณสามารถทำให้มันเป็นobjectURLรหัส. อัพเดทลำธารภาพเป็นบัฟเฟอร์และกินมันบนไคลเอนต์จากนั้นเปลี่ยนเป็น objectURL และกำหนดให้กับภาพ src

รหัสเซิร์ฟเวอร์:

const http = require('http')
const axios = require('axios')
const fs = require('fs')
const stream = require('stream')
const server = http.createServer(function(req, res) {
  if (req.url === '/') {


    res.setHeader("Access-Control-Allow-Origin", "*");
    axios.post(
      "https://su05.consensusintl.net/b1s/v1/ItemImages('test')/$value", {
        responseType: "blob"
      }).then(function(resp) {
      console.log(resp.data)
      const buf_stream = new stream.PassThrough()
      buf_stream.end(Buffer.from(resp.data))
      buf_stream.pipe(res.end())
    }).catch(err => console.log(err))
  }
})


server.listen(3500)

รหัสลูกค้า:

<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title></title>
</head>

<body>
  <img style="width:200px; height:200px" />
  <script>

  const img = document.getElementsByTagName("IMG")
  fetch('http://localhost:3500').then(function(response) {
    console.log(response)
    return response.body
  }).then(function(data) {
    console.log(data)
    const reader = data.getReader()
     return new ReadableStream({
    start(controller) {
      return pump();
      function pump() {
        return reader.read().then(({ done, value }) => {
          // When no more data needs to be consumed, close the stream
          if (done) {
              controller.close();
              return;
          }
          // Enqueue the next data chunk into our target stream
          controller.enqueue(value);
          return pump();
        });
      }
    }
  })
})
  .then(stream => new Response(stream))
  .then(response => response.blob())
  .then(blob => URL.createObjectURL(blob))
  .then(url => img[0].src = url)
  .catch(err => console.error(err));
    </script>
</body>

</html>

เฮ้สิ่งหนึ่งที่ฉันลืมที่จะบอกคุณว่าฉันได้รับภาพที่นี่GET : https://su05.consensusintl.net/b1s/v1/ItemImages('test')/$valueแต่เมื่อฉันผ่านสิ่งเดียวกันมันไม่ทำงาน แจ้งให้เราทราบหากคุณมีความคิดที่ดีกว่าขออภัยถ้าฉันรบกวนคุณ
Dhaval Jardosh

ความซาบซึ้งเล็กน้อยจากด้านข้างของฉัน :)
Dhaval Jardosh

ดูรหัสปรับปรุง นี่คือความพยายามครั้งสุดท้ายของฉัน หวังว่าคุณจะพบทางออก
C.Gochev

0

ปัญหานี้ได้รับการแก้ไขแล้ว

const getImage = async (sessionId, ItemCode) => {
  console.log("fetching image");
  let result = {};

  result = await axios.get(
    `${settings.url}${endpoints.ItemImages}('${ItemCode}')/$value`,
    { 
      headers: {Cookie: `B1SESSION=${sessionId}`},
      responseType: "arraybuffer" } 
    ).then(response => Buffer.from(response.data, 'binary').toString('base64'));

  //Here we're returning base64 value of Image
  return result;
};

ดังนั้นเราสามารถเห็นภาพบนฝั่งไคลเอ็นต์โดยใช้

<img src="data:image/png;base64,[BASE64-VALUE-HERE]"/>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.