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

时间:2020-03-19 11:56:26

标签: node.js rest express multipartform-data fs

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

我以前使用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);

2 个答案:

答案 0 :(得分:0)

据我了解,您尝试在Nodejs中创建Blob。它没有定义,但基本上是带有文件信息的arraybuffer。也许,您可以使用外部npm软件包使其成为斑点。 Check this

答案 1 :(得分:0)

使用fs.createReadStream()而不是fs.readFile()而不在文件流中上传图像,首先读取文件,然后将其添加到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);