Discord.js:如何将用户上传文件保存至Repl.it本地环境
问题解决方案
为什么会写入空文件
你代码里的a.file根本不是附件的内容——Discord.js的Attachment对象没有这个属性,直接写入自然得到undefined,所以文件是空的。机器人没法直接拿到文件的本地内容,只能通过附件的URL去下载。
修正后的代码(适配斜杠命令)
注意斜杠命令的处理对象是interaction而非message,下面是完整的斜杠命令示例,用异步流处理下载更稳定:
const { SlashCommandBuilder } = require('discord.js'); const fs = require('fs'); const https = require('https'); const { promisify } = require('util'); const pipeline = promisify(require('stream').pipeline); module.exports = { data: new SlashCommandBuilder() .setName('savefile') .setDescription('上传文件到Repl.it服务器') .addAttachmentOption(opt => opt.setName('target') .setDescription('要保存的文件') .setRequired(true)), async execute(interaction) { // 先回复避免超时 await interaction.deferReply({ ephemeral: true }); const attachment = interaction.options.getAttachment('target'); try { // 从附件URL下载并写入本地 const res = await new Promise((resolve, reject) => { https.get(attachment.url, resolve).on('error', reject); }); await pipeline(res, fs.createWriteStream(`./${attachment.name}`)); await interaction.editReply(`文件 \`${attachment.name}\` 保存成功!`); } catch (err) { await interaction.editReply(`保存失败:${err.message}`); } } };
关键注意点
- 斜杠命令的附件必须用
interaction.options.getAttachment()获取,别再用message.attachments - 一定要通过
attachment.url拉取文件内容,Discord不会把文件直接传给机器人 - Repl.it的本地项目根目录允许读写,不要写超出该范围的路径
- 用异步流处理大文件不会阻塞机器人,比同步写入更靠谱
优化技术问题的提问方式
- 补全环境细节:说明使用的Discord.js版本、Repl.it的Node.js版本,以及斜杠命令的注册方式
- 明确差异与错误:如果控制台有报错直接贴出;无报错则清晰描述预期行为(写入文件内容)和实际行为(创建空文件)的差异
- 精简代码片段:只贴与附件处理相关的核心代码,无需提供整个机器人的冗余代码
- 说明已做尝试:比如是否打印过Attachment对象的所有属性、是否测试过附件URL的可访问性、是否检查过Repl.it的文件权限
内容的提问来源于stack exchange,提问作者Altify
相关产品推荐
相关产品推荐

