File Upload
type: 19
Modales
Vista previa modal.json
data de MODAL_SUBMIT (resumida)
El File Upload deja que el usuario suba archivos (hasta 10) desde un modal. Va dentro de un Label.
Enviar captura
Capturas del error*
Sube hasta 3 imágenes.
Arrastra archivos o haz clic para subir
{ "type": 9, "data": { "custom_id": "enviar_captura", "title": "Enviar captura", "components": [ { "type": 18, "label": "Capturas del error", "description": "Sube hasta 3 imágenes.", "component": { "type": 19, "custom_id": "capturas", "min_values": 1, "max_values": 3, "file_types": [ "image" ] } } ] }}| Campo | Tipo | Descripción |
|---|---|---|
type |
entero | obligatorio Siempre 19. |
id |
entero | opcional Identificador único. |
custom_id |
string | obligatorio 1-100 caracteres. |
min_values |
entero | opcional Mínimo de archivos (0-10). Por defecto 1. |
max_values |
entero | opcional Máximo de archivos (máx. 10). Por defecto 1. |
required |
booleano | opcional Por defecto true. |
file_types |
array de strings | opcional Hasta 10 filtros: "image", "video", "audio" o extensiones como ".pdf". |
Qué recibe tu bot
Sección titulada «Qué recibe tu bot»En values llegan los IDs de los adjuntos, y los datos completos (URL, nombre, tamaño…) en resolved.attachments:
{ "custom_id": "enviar_captura", "components": [ { "type": 18, "id": 1, "component": { "type": 19, "id": 2, "custom_id": "capturas", "values": ["111111111111111111"] } } ], "resolved": { "attachments": { "111111111111111111": { "id": "111111111111111111", "filename": "error.png", "size": 48213, "url": "https://cdn.discordapp.com/ephemeral-attachments/...", "content_type": "image/png" } } }}Responde a la interacción con el JSON de arriba.
await interaction.showModal({ custom_id: 'enviar_captura', title: 'Enviar captura', components: [ { type: 18, label: 'Capturas del error', component: { type: 19, custom_id: 'capturas', min_values: 1, max_values: 3 }, }, ],});
// Al enviar el modalif (interaction.isModalSubmit() && interaction.customId === 'enviar_captura') { const files = interaction.fields.getUploadedFiles('capturas'); // Collection<id, Attachment> const urls = files.map((file) => file.url);}class EnviarCaptura(discord.ui.Modal, title="Enviar captura"): capturas = discord.ui.Label( text="Capturas del error", description="Sube hasta 3 imágenes.", component=discord.ui.FileUpload(min_values=1, max_values=3), )
async def on_submit(self, interaction: discord.Interaction): archivos = self.capturas.component.values # lista de discord.Attachment nombres = ", ".join(a.filename for a in archivos) await interaction.response.send_message(f"Recibido: {nombres}", ephemeral=True)minFiles := 1discordgo.Label{ Label: "Capturas del error", Description: "Sube hasta 3 imágenes.", Component: discordgo.FileUpload{ CustomID: "capturas", MinValues: &minFiles, MaxValues: 3, },}
// Al recibir MODAL_SUBMIT, el *discordgo.FileUpload trae los IDs en Values.// Los datos completos de cada archivo están en data.resolved.attachments de la interacción.