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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:50:21