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

如何通过Discord API的POST请求发送本地图片?

如何通过附件发送本地图片到Discord

你当前的问题核心在于:上传本地文件必须使用multipart/form-data格式提交请求,但你仍在将请求体序列化为JSON,且Attachment对象用了远程URL而非本地文件内容。以下是修正方案:

核心要点

  • 不能将请求体转为JSON,需用multipart/form-data格式,把消息元数据(内容、Embed、引用信息等)放在payload_json字段,本地文件作为独立的表单字段上传。
  • 本地文件需要读取为Buffer或流,无需手动构造包含URL的Attachment对象,而是在payload_json的Embed中用attachment://文件名指向上传的文件。

修正后的代码示例

1. 消息事件代码(读取本地文件)

const fs = require('fs');
const path = require('path');

// 读取本地图片为Buffer
const fileBuffer = fs.readFileSync(path.join(__dirname, 'ciao.gif'));
const filename = 'ciao.gif';

const ebd = {
  color: EMBED_COLOR,
  image: {
    url: `attachment://${filename}`
  }
};

// 调用reply函数时传入文件Buffer、文件名和其他参数
await msg.reply({ 
  content: "Pong", 
  embeds: [ebd], 
  file: { buffer: fileBuffer, filename },
  ref: true // 根据实际需求传引用标记
});

2. 回复函数代码(使用multipart/form-data提交)

需要借助form-data库来构造多部分表单(先安装:npm install form-data):

const FormData = require('form-data');
const request = require('request');

try {
  const form = new FormData();

  // 构造消息元数据的JSON字符串
  const payload = JSON.stringify({
    content,
    embeds,
    message_reference: ref
      ? {
          message_id: this.id,
          channel_id: this.channel_id,
        }
      : null,
  });

  // 添加元数据字段
  form.append('payload_json', payload);

  // 添加本地文件(这里的file参数是消息事件中传入的{ buffer, filename })
  form.append('files[0]', file.buffer, { filename: file.filename });

  // 发送请求,form会自动设置正确的Content-Type(包含boundary)
  const req = await request(
    API_URL + "channels/" + this.channel_id + "/messages",
    {
      headers: {
        ...headers, // 保留你的Authorization等头部,不需要手动加Content-Type
        ...form.getHeaders() // 由form-data自动生成正确的multipart头部
      },
      method: "POST",
      body: form
    }
  );

  if (req.statusCode !== 200) {
    throw new Error("Bad request! code: " + req.statusCode);
  }
  return 200;
} catch (err) {
  console.error(err);
}

关键说明

  • 不要手动设置Content-Type: multipart/form-data,因为multipart需要boundary分隔符,form-data库会自动生成正确的头部。
  • 上传的文件字段名格式为files[index](比如files[0]对应第一个文件),如果上传多个文件,依次递增索引即可。
  • Embed中引用附件时,必须使用attachment://文件名的格式,文件名要和上传时的filename一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:46:05