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

如何使用NodeJs实现多文件上传代理转发至远程PHP接口

最优实现方案:基于http-proxy-middleware的透明代理(类Nginx实现)

该方案与Nginx代理行为完全一致,不需要解析multipart/form-data请求体,直接透传原始请求,性能损耗最低,不会破坏多文件数组的结构,无需修改PHP端原有接收逻辑,是首选方案。

实现步骤

  • 安装依赖
    npm install http-proxy-middleware
  • Express配置代码
const { createProxyMiddleware } = require('http-proxy-middleware');
const express = require('express');
const app = express();

// 上传代理路由必须放在express.json()/express.urlencoded()等body解析中间件之前
// 禁止在该路由上使用multer等解析multipart请求的中间件,避免破坏原始请求体
app.use('/api/upload', createProxyMiddleware({
  target: 'https://替换为实际PHP API域名', // 远程PHP接口的根地址
  changeOrigin: true, // 等价于Nginx的proxy_set_header Host $host,解决跨域校验问题
  followRedirects: true,
  onProxyReq: (proxyReq, req, res) => {
    // 可选:透传自定义头,比如鉴权信息
    // proxyReq.setHeader('X-Auth-Token', req.headers['x-auth-token']);
  }
}));

// 其他业务路由的body解析中间件放在代理配置之后
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.listen(3000);

注意:该方案会完整透传原始请求的所有字段、文件结构,PHP端用$_FILES['字段名']接收多文件数组的逻辑不需要做任何调整。


备选方案:模拟表单重提交(兜底方案)

如果需要在Node端先对上传文件做校验、裁剪等预处理操作,再转发到PHP接口,可以用该方案。

实现步骤

  • 安装依赖
    npm install multer form-data axios
  • Express配置代码
const multer = require('multer');
const FormData = require('form-data');
const axios = require('axios');
const express = require('express');
const app = express();

// 配置multer内存存储,避免写入磁盘提升性能
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

// 多文件数组上传,第二个参数为最大上传数量,字段名要和前端提交的字段保持一致
app.post('/api/upload', upload.array('files', 10), async (req, res) => {
  try {
    const form = new FormData();
    // 追加所有上传的文件到新表单
    req.files.forEach(file => {
      // 字段名后缀加[]适配PHP数组接收规则
      form.append('files[]', file.buffer, {
        filename: file.originalname,
        contentType: file.mimetype
      });
    });
    // 追加其他原始表单字段
    Object.keys(req.body).forEach(key => {
      form.append(key, req.body[key]);
    });

    // 提交请求到远程PHP接口
    const phpResponse = await axios.post('https://替换为实际PHP接口完整地址', form, {
      headers: {
        ...form.getHeaders(),
        // 可选透传自定义头
        'X-Auth-Token': req.headers['x-auth-token']
      }
    });

    // 原样返回PHP接口的响应给前端
    res.status(phpResponse.status).json(phpResponse.data);
  } catch (err) {
    res.status(err.response?.status || 500).json({
      error: '转发请求失败',
      detail: err.message
    });
  }
});

app.listen(3000);

方案选择建议
  • 优先选择透明代理方案:无额外的请求解析/构建开销,不需要处理文件编码、字段名适配问题,兼容性最好,完全符合类Nginx代理的需求。
  • 只有当需要在Node端对上传文件做预处理操作时,再选择模拟表单重提交方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:57:05