Как прочитать изображение из локального и преобразовать его в файл объекта, используя node.js - PullRequest
0 голосов
/ 19 марта 2020

У меня есть файл .png в папке проекта моего узла, и я хочу прочитать этот файл и отправить его на удаленный API REST, который принимает формат данных формы и возвращает URL-адрес изображения после его загрузки в S3.

Ранее я использовал тот же API для загрузки изображений в интерфейс, используя JavaScript. В моем приложении JS я использовал файл типа ввода для загрузки изображения, которое давало мне изображение в формате файла, а затем я передавал его в API после добавления этого файла в объект formData, например:

let formData = new FormData(); formData.append("content_file", file)

но когда я пытаюсь сделать то же самое в node.js, я не могу прочитать этот файл в формате файла, из-за чего Api не принимает тело запроса. Я новичок в node js, я даже не уверен, что читаю файл правильно или нет. Пожалуйста, помогите!

var express = require('express');
var fs = require('fs');
var path = require('path');
var Request = require("request");
var FormData = require('form-data');
var app = express();

// for reading image from local
app.get('/convertHtml2image1', function (req, res) {
    fs.readFile(`image_path`, (err, data) => {
        if (err) res.status(500).send(err);
        let extensionName = path.extname(`banner.png`);
        let base64Image = new Buffer(data, 'binary').toString('base64');
        let imgSrcString = `data:image/${extensionName.split('.').pop()};base64,${base64Image}`;

        // for converting it to formData
        let formData = new FormData();
        formData.append("content_file", data)
        
        // for calling remote REST API
        Request.post({
            "headers": { "token": "my_token" },
            "url": "api_url",
            "body": formData
        }, (error, response, body) => {
            if (error) {
                return console.log(error);
            }
            let result = JSON.parse(body)
            res.send("image_url: " + result.url)
        });
    })
})

app.listen(5000);

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Вместо fs.readFile () используйте fs.createReadStream () и не загружайте изображение в файловый поток, сначала прочитайте файл, затем добавьте его в formData и затем загрузите (или отправьте в api), потому что вместо файла вы загружали поток здесь.

var express = require('express');
var fs = require('fs');
var path = require('path');
var Request = require("request");
var FormData = require('form-data');
var app = express();

app.get('/convertHtml2image', function (req, res) {
    
    var formData = {
        name: 'content_file',
        content_file: {
            value: fs.createReadStream('banner.png'),
            options: {
                filename: 'banner.png',
                contentType: 'image/png'
            }
        }
    };

    Request.post({
        "headers": {
            "Content-Type": "multipart/form-data",
            "token": my_token
        },
        "url": api_url,
        "formData": formData
    }, (error, response, body) => {
        if (error) {
            return console.log("Error: ", error);
        }
        let result = JSON.parse(body)
        res.send("image_url: " + result.url)
    });
})

app.listen(5000);
0 голосов
/ 19 марта 2020

Насколько я понимаю, вы пытаетесь создать BLOB-объекты в Nodejs. Он не определен, но в основном это массив буферов с информацией о файле. Возможно, вы можете использовать внешний пакет npm, чтобы сделать его каплей. Проверьте это

...