Как изменить fs.writeFile () и избежать загрузки изображений на сервер? - PullRequest
0 голосов
/ 07 августа 2020

Пример использования: получение до 5 изображений, прикрепленных к одной записи crm, из базы данных crm. Эти прикрепленные изображения затем отображаются в галерее изображений при открытии веб-страницы записи html.

В настоящее время мы пишем ответ двоичного изображения API на сервер приложения с помощью fs.writeFile (). Затем html считывает изображение из папки сервера.

Проблема в том, что когда изображения загружаются в первый раз, а страница html загружается в первый раз, ничего не отображается и и в консоли возникает ошибка 404.

Как избежать этой проблемы? Я знаю, что вы можете обойти загрузку изображений на сервер приложений путем потоковой передачи или передачи данных напрямую на клиентскую сторону?

Вот как мы сейчас настроили код:

Сервер nodejs

const http = require('http');
const fs = require('fs');
const express = require('express');
const app =  express();

app.set('view engine', 'ejs');

app.get('/property', function(req, res) {

var content = responseContent.body;
var filename = responseContent.filename;

   // *ITEM GET RESPONSE* //
   inputItem = {};
   inputItem.id = req.query.id; // id: record-id
   inputItem.module = 'Properties';

   crmRestClient.API.MODULES.get(inputItem).then(function(response_item) {

      var response_item = JSON.parse(response_item.body);
      var response_item = response_item.data[0];;
     
      if(response_item.Files !== null) {
         // Loop through attached images
         for (var i = 0; i < response_item.Files.length; i++) {
            var image = response_item.Files[i];
           
            // *MEDIA DOWNLOAD RESPONSE* //
            var inputContent = {};

            inputContent.id = req.query.id;
            inputContent.module = 'Properties';
            inputContent.relatedId = image.attachment_Id;
            inputContent.download_file = true;
            
            crmRestClient.API.ATTACHMENTS.downloadFile(inputContent).then(function(responseContent) {

               const content = responseContent.body;
               
               // Buffer image data
               base64data = Buffer.from(content, 'binary').toString('base64');    
            })
         }
      } 
      res.render('property', {qs: req.query, response_item:response_item, image_data:base64data})
   })
})

html

<% if(response_item.Files !== null) { %>
    <% for (var i = 0; i < response_item.Files.length; i++) { %>
        <% var image = response_item.Files[i]; %>

        <div class="swiper-slide" data-swiper-slide-index="0" style="width: 474.333px;">
            <a href="data:image/jpg;base64,<%= image_data %>" data-toggle="gallery-top" title="<%= image.file_Name %>">
                <img class="img-fluid" src="data:image/jpg;base64,<%= image_data %>" alt="PIC 01">
            </a>
        </div>

    <% } %> 
<% } %>

Как я могу настроить это так, чтобы он выводился напрямую в html без предварительной загрузки изображений на сервер?

С уважением, тэмин

...