You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js读取本地PNG文件转为File对象上传REST API求助

解决Node.js本地文件通过form-data上传到REST API的问题

我懂你现在的困扰——前端用File对象能轻松搞定文件上传,但Node.js里没有浏览器的File类,直接传Buffer会被API拒绝。咱们一步步来修正你的代码:

问题分析

你的代码里有两个核心问题:

  1. 向formData.append传递数据时,只传了Buffer,缺少文件名和文件类型信息,导致API无法识别这是一个合法的文件
  2. 使用Request库发送请求时,没有正确处理form-data的请求头,直接把formData放在body里是错误的用法

修正后的代码

先确保依赖都安装好(如果还没装的话):

npm install express form-data request

然后替换你的路由代码:

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('/convertHtml2image1', function (req, res) {
  // 替换成你的本地图片实际路径
  const imagePath = path.join(__dirname, 'banner.png');
  
  // 用文件流代替readFile,大文件上传更高效,避免内存占用过高
  const imageStream = fs.createReadStream(imagePath);
  
  // 获取文件扩展名,用来设置正确的MIME类型
  const extension = path.extname(imagePath).slice(1); // 去掉前面的点,得到png/jpg等
  const mimeType = `image/${extension}`;

  // 构建form-data,这里要传入文件的关键信息
  let formData = new FormData();
  formData.append("content_file", imageStream, {
    filename: 'banner.png', // 文件名,API需要识别这个字段
    contentType: mimeType   // 文件MIME类型
  });

  // 发送POST请求到远程API
  Request.post({
    url: "api_url", // 替换成你的实际API地址
    headers: { 
      "token": "my_token",
      // 让form-data自动生成带boundary的Content-Type头,这是form-data必须的
      ...formData.getHeaders()
    },
    // 使用Request的formData选项,库会自动处理编码和传输
    formData: formData
  }, (error, response, body) => {
    if (error) {
      console.error(error);
      return res.status(500).send('上传失败:' + error.message);
    }
    try {
      let result = JSON.parse(body);
      res.send("image_url: " + result.url);
    } catch (parseErr) {
      res.status(400).send('API返回格式错误:' + body);
    }
  });
})

app.listen(5000, () => {
  console.log('服务器运行在http://localhost:5000');
});

关键改进点

  • 用文件流代替readFile:fs.createReadStream可以边读文件边上传,适合大文件场景,避免一次性把文件加载到内存
  • 完善form-data项:通过append的第三个参数传入文件名和contentType,让API能正确识别这是一个文件
  • 正确处理请求头:通过formData.getHeaders()获取form-data必需的boundary信息,合并到请求头中
  • 使用Request的formData选项:Request库会自动处理form-data的编码和传输逻辑,不用手动设置body

额外提示

如果你的Node.js版本是18及以上,可以考虑用原生fetch API,不需要依赖Request库,代码会更简洁:

// 原生fetch示例(Node.js 18+)
const formData = new FormData();
formData.append('content_file', fs.createReadStream(imagePath), {
  filename: 'banner.png',
  type: mimeType
});

fetch("api_url", {
  method: 'POST',
  headers: {
    "token": "my_token",
    // fetch会自动处理form-data的Content-Type,无需手动添加
  },
  body: formData
})
.then(res => res.json())
.then(result => res.send("image_url: " + result.url))
.catch(err => res.status(500).send(err.message));

记得替换代码里的imagePath和api_url为你实际的路径和API地址,应该就能成功上传图片并拿到返回的URL了~

内容的提问来源于stack exchange,提问作者4LPH4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:52:51