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

Node.js开发Zoho Catalyst文件上传API出现请求体格式错误如何解决

解决方案

你遇到的请求体格式错误,是因为Readable.from(req.file.buffer)生成的内存可读流缺少Zoho Catalyst SDK依赖的文件元字段,和官方示例中fs.createReadStream返回的本地文件流属性不一致,导致SDK无法正确解析上传参数。

以下是两种可直接落地的实现方案:

方案1:使用磁盘临时文件(官方示例兼容方案,稳定性最高)

调整multer为磁盘存储模式,直接使用官方推荐的fs.createReadStream读取临时文件上传,上传完成后可自动清理临时文件。

步骤1:调整multer配置

const multer = require('multer');
// 配置临时文件存储目录,目录需提前创建
const upload = multer({ dest: 'tmp/uploads/' });

步骤2:修正业务代码

const fs = require('fs');
expressApp.post('/uploadFile', upload.single('file'), (req, res) => {
  (async () => {
    try {
      if (req.file && req.body.folderId) {
        const app = catalyst.initialize(req);
        const filestore = app.filestore();
        const folder = filestore.folder(req.body.folderId);
        // 遵循官方示例格式传入文件流
        const uploadConfig = {
          code: fs.createReadStream(req.file.path),
          name: req.file.originalname
        };
        const result = await folder.uploadFile(uploadConfig);
        // 上传完成后删除本地临时文件
        fs.unlink(req.file.path, (err) => err && console.error('临时文件清理失败:', err));
        return res.status(200).json(successResponse(result));
      }
      // 参数缺失建议返回400状态码,符合HTTP规范
      return res.status(400).json(errorResponse('Required parameter is missing!'));
    } catch (error) {
      // 报错时也清理临时文件避免占用磁盘
      req.file?.path && fs.unlink(req.file.path, () => {});
      return res.status(500).json(errorResponse(error));
    }
  })();
});

方案2:使用内存流(无需写入本地磁盘)

如果业务要求不能存储临时文件,可给内存流补上SDK需要的元属性即可正常上传:

步骤1:multer使用内存存储配置

const multer = require('multer');
const upload = multer({ storage: multer.memoryStorage() });

步骤2:修正业务代码

const { Readable } = require('stream');
expressApp.post('/uploadFile', upload.single('file'), (req, res) => {
  (async () => {
    try {
      if (req.file && req.body.folderId) {
        const app = catalyst.initialize(req);
        const filestore = app.filestore();
        const folder = filestore.folder(req.body.folderId);
        const fileStream = Readable.from(req.file.buffer);
        // 补上SDK需要的文件元属性
        fileStream.path = req.file.originalname;
        fileStream.size = req.file.size;
        const uploadConfig = {
          code: fileStream,
          name: req.file.originalname
        };
        const result = await folder.uploadFile(uploadConfig);
        return res.status(200).json(successResponse(result));
      }
      return res.status(400).json(errorResponse('Required parameter is missing!'));
    } catch (error) {
      return res.status(500).json(errorResponse(error));
    }
  })();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:54:02