如何从本地读取图像并使用 node.js 将其转换为文件对象

how to read image from local and convert it into file object using node.js

我的节点项目文件夹中有一个 .png 文件,我想读取该文件并将该文件发送到接受表单数据格式和 returns 图像的远程 REST api url 上传到 S3 后。

我之前使用 JavaScript 在前端使用相同的 api 上传图片。在我的 JS 应用程序中,我使用输入类型文件上传图像,它以文件格式提供图像,然后在将该文件添加到 formData 对象后将其传递给 api,如下所示:

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);

据我了解,您尝试在 Nodejs 中创建 Blob。它没有定义,但它基本上是一个带有文件信息的数组缓冲区。也许,您可以使用外部 npm 包来使其成为 blob。 Check this

而不是 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);