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

如何使用Node的fetch API向Cloudflare Images上传图片?

解决Node.js fetch上传Cloudflare Images返回400错误的问题

问题根源

  1. 手动设置Content-Type导致解析失败:你手动添加了"Content-Type": "multipart/form-data",但fetch会自动为FormData生成包含boundary的正确Content-Type头,手动设置的头缺少这个关键参数,Cloudflare无法正确解析表单数据。
  2. 文件流缺少必要元信息:仅传递fs.createReadStream可能没有告知Cloudflare文件名和文件类型,导致服务端无法识别上传的文件。

修正方案

方案1:读取文件为Buffer转Blob(推荐)

这种方式能确保传递完整的文件元信息,且适配Node.js 18+内置的fetch API:

const fs = require('fs').promises;

async function uploadToCloudflare() {
  const cloudflareApiToken = '你的API令牌';
  const accountId = '你的账户ID';

  // 读取文件为Buffer
  const fileBuffer = await fs.readFile('testing.jpeg');
  // 创建带MIME类型的Blob
  const fileBlob = new Blob([fileBuffer], { type: 'image/jpeg' });

  const formData = new FormData();
  // 必须指定文件名(第三个参数)
  formData.append('file', fileBlob, 'testing.jpeg');

  const response = await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/images/v1`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${cloudflareApiToken}`
      // 不要手动设置Content-Type!
    },
    body: formData
  });

  // 打印响应详情用于调试
  console.log('状态码:', response.status);
  console.log('响应内容:', await response.text());
}

uploadToCloudflare();

方案2:使用文件流并补充元信息

如果你坚持使用createReadStream,需要指定文件名和Content-Type,同时用FormData的getHeaders()获取正确的请求头:

const fs = require('fs');

async function uploadToCloudflare() {
  const cloudflareApiToken = '你的API令牌';
  const accountId = '你的账户ID';

  const formData = new FormData();
  // 补充文件名和MIME类型
  formData.append('file', fs.createReadStream('testing.jpeg'), {
    filename: 'testing.jpeg',
    contentType: 'image/jpeg'
  });

  const response = await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/images/v1`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${cloudflareApiToken}`,
      // 继承FormData自动生成的头(包含boundary)
      ...formData.getHeaders()
    },
    body: formData
  });

  console.log('状态码:', response.status);
  console.log('响应内容:', await response.text());
}

uploadToCloudflare();

额外调试建议

  • 始终打印响应的完整文本,Cloudflare的400错误会返回具体错误提示(比如"filename is required"),能快速定位问题。
  • 确认你的API令牌拥有Account > Images > Edit权限,权限不足也会导致上传失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:50:41