如何在Rust中向Discord Webhook发送文件?(遇400错误)
解决Discord Webhook文件上传400错误的方法
你的代码存在几个关键问题导致请求返回400 Bad Request,以下是具体修正方案:
错误点及修复说明
- 移除手动添加的
Content-Disposition字段:multipart表单的每个部分的Content-Disposition由reqwest自动处理,手动添加该文本字段会干扰Discord API对请求结构的解析。 - 删除手动设置的
Content-Type头:reqwest的.multipart()方法会自动生成包含正确boundary的multipart/form-data头,手动设置会覆盖这个自动生成的合法头,直接导致请求格式错误。 - 补充
image变量的初始化逻辑:原代码中引用了image.as_slice()但未定义该变量,需要先读取目标文件的字节数据。
修正后的完整代码
use anyhow::Result; use reqwest::multipart; use std::fs; #[tokio::main] async fn main() -> Result<()> { // 读取本地图片文件,替换为你的实际文件路径 let image = fs::read("text.png")?; let client = reqwest::Client::new(); let part = multipart::Part::bytes(image) .file_name("text.png") .mime_str("image/png")?; let form = multipart::Form::new() .part("files[0]", part); let res = client .post("https://discord.com/api/webhooks/6969696969/XD_XD_XD_XD_XD_XD_XD_XD") .query(&[("wait", "true")]) .multipart(form) .send() .await?; println!("响应状态码: {}", res.status()); println!("响应内容: {}", res.text().await?); Ok(()) }
额外提示
- 若需同时发送消息文本,可在表单中添加
.text("content", "这里是要发送的消息内容")字段。 - 确保替换代码中的Webhook URL为你自己的有效地址。
- 依赖配置:在
Cargo.toml中添加以下内容
[dependencies] reqwest = { version = "0.11", features = ["multipart", "json"] } anyhow = "1.0" tokio = { version = "1.0", features = ["full"] }
内容的提问来源于stack exchange,提问作者NightmareXD
相关产品推荐
相关产品推荐

