C# Discord Bot本地图片上传失败及URL图片加载异常求助
解决Discord Bot本地图片上传与Embed引用问题
我之前调试Discord Bot时也碰到过一模一样的情况——临时附件URL失效、本地路径直接赋值给Embed.ImageUrl完全没用,甚至还会触发WebSocket错误。别担心,这两个问题其实都有明确的解决办法:
为什么本地路径直接用不行?
Discord的Embed组件里的ImageUrl要求是可公开访问的网络URL,你本地机器的文件路径(比如C:/xxx.png)只有你的Bot所在服务器能访问,Discord的CDN根本拉不到这个文件,所以自然显示不出来。
正确的本地图片上传方案:用FileAttachment直接上传
解决思路是把本地图片作为消息附件上传到Discord,然后在Embed里引用这个上传后的附件。这种方式上传的图片会被Discord永久存储(只要消息不被删除),不会出现重新打开客户端后失效的问题,也能避免WebSocket加载错误。
具体代码示例(基于Discord.NET库)
假设你用的是Discord.NET(C#开发Discord Bot最常用的库),可以这么写:
// 获取目标频道(替换成你的频道ID) var targetChannel = _discordClient.GetChannel(1234567890) as IMessageChannel; if (targetChannel == null) { Console.WriteLine("无法找到目标频道"); return; } // 本地图片路径(注意用@转义斜杠,或者双反斜杠) string raidImagePath = @"C:\Users\Administrator\Desktop\DiscordBot\Pictures\Lvl40raid.png"; // 创建文件附件对象,第二个参数是上传后显示的文件名(可选,建议和原文件名一致) var raidAttachment = new FileAttachment(raidImagePath, "Lvl40raid.png"); // 创建Embed,关键是用`attachment://文件名`来引用附件 var raidEmbed = new EmbedBuilder() .WithTitle("Lv40 Raid Lane 已创建") .WithDescription("点击下方按钮认领这条进攻路线!") .WithImageUrl("attachment://Lvl40raid.png") // 这里必须和附件的文件名一致 .WithColor(Color.Green) .Build(); // 发送消息:同时带上Embed和附件 await targetChannel.SendMessageAsync(embed: raidEmbed, files: new[] { raidAttachment });
注意事项
- 确保你的Bot在服务器里有Attach Files权限,否则无法上传附件。
- 路径处理:Windows路径用
@"C:\xxx\yyy.png"或者"C:\\xxx\\yyy.png"都可以,避免单斜杠导致的转义错误。 - 不同难度的Raid只需要切换
raidImagePath对应的文件路径即可,逻辑完全通用。
关于原URL方式失效的补充
如果你之前用的是Discord临时附件URL,这类URL本身就有有效期,而且客户端重新加载时可能因为缓存或者WebSocket连接问题无法重新拉取资源,导致显示异常。用本地文件直接上传的方式从根源上解决了这个问题,因为附件会被Discord持久化存储。
内容的提问来源于stack exchange,提问作者IAreBeGreat
相关产品推荐
相关产品推荐

