如何在 Node 中使用“fs”将 FormData 图像文件保存到本地

问题描述 投票:0回答:2

我有一个 React 前端,允许用户使用

FormData()
将图像发送到节点后端。

Express
后端控制器中,我使用
multer
作为中间件将图像抓取到
files
变量中:

  private initializeRoutes() {
    this.router.post(`${this.path}/image`, multerUpload.array("filesToUpload[]"), this.saveImage);
  }

在后端服务中,我尝试将

files[0]
保存到
uploads
文件夹中:

  public saveImage(files: any) {
    console.log("OtherServiceLocal saveImage - files :");
    console.log(files[0]); // see screenshot at bottom for output

    let localPath = fs.createWriteStream("./uploads/image.png");

    files[0].buffer.pipe(localPath);
  }

但我收到错误:

我尝试了管道

file[0]
file[0].buffer
无济于事,即使经过一些研究,我也很难理解如何将其转换为流。

这是

console.log(files[0]);

的输出
{
  fieldname: 'filesToUpload[]',
  originalname: 'Screen Shot 2021-09-08 at 3.42.48 PM.png',
  encoding: '7bit',
  mimetype: 'image/png',
  buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 03 85 00 00 02 c5 08 06 00 00 00 74 ff 46 78 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 00 62 ... 249405 more bytes>,
  size: 249455
}

请注意,我知道您可以使用 multer 的

upload
方法将图像直接保存为路由器中的中间件,但由于我的应用程序的某些要求,我无法这样做。

谢谢,

node.js image express file-upload fs
2个回答
1
投票

file[0].buffer
是Buffer的一个实例。 所以你可以直接使用
fs.writeFile

fs.writeFile("./uploads/image.png", file[0].buffer, (err) => {
    console.error(error)
})

0
投票

在带有 TypeScript 的 Node JS 中

我正在使用以下包进行上传过程。我们还可以使用 MULTER npm 包。

npm i formidable

import * as path from "path";
const fs = require("fs");
const formidable = require('formidable');



    async saveMediaFileInMachineStorage(req: ReqInterface, res: ResInterface, next: NextFunction) {
      const form = new formidable.IncomingForm();

        form.parse(req, async function (err, fields, files) {

        if (err) {
            console.log("Error", err)
        }
        if(files?.profilePic){
                    let writer = fs.createWriteStream(files?.profilePic[0]?.originalFilename, { flags: 'w' } ); 
                    let reader = fs.createReadStream(files?.profilePic[0].filepath).pipe(writer);
       }
    })

// return res.status(200).json({ status: 200, statusText: 'SUCCESS', message: "File in storage.", data: {status: true} })

}
    

Below is API Request over POSTMAN which we have to send for testing upload file process. 

© www.soinside.com 2019 - 2024. All rights reserved.