Envío y recepción de archivos

Importante

  • Los agentes no admiten el envío y la recepción de archivos en Government Community Cloud High (GCC High), el Departamento de Defensa (DoD) y Teams operados por entornos de 21Vianet.

Hay dos maneras de enviar y recibir archivos:

Uso de graph API

Publique mensajes con datos adjuntos de tarjeta que hagan referencia a archivos de SharePoint ya existentes, mediante Graph API para OneDrive y SharePoint. Para usar graph API, obtenga acceso a cualquiera de las siguientes opciones a través del flujo de autorización estándar de OAuth 2.0:

  • Carpeta de OneDrive de un usuario para archivos personal y groupchat.
  • Los archivos del canal de un equipo para channel archivos.

Las API de Graph funcionan en todos los ámbitos de Teams. Para obtener más información, vea enviar datos adjuntos de archivos de mensajes de chat.

Como alternativa, puede enviar y recibir archivos desde un agente mediante las API de consentimiento de archivos del SDK de Teams.

Las API de consentimiento de archivos del SDK de Teams solo funcionan en el personal contexto. No funcionan en el channel contexto o groupchat .

Con el SDK de Teams, el agente puede enviar y recibir archivos directamente con los usuarios en el personal contexto, también conocidos como chats personales. Implemente funcionalidades, como son informes de gastos, reconocimiento de imágenes, archivado de archivos y firmas electrónicas que implican la edición del contenido del archivo. Los archivos compartidos en Teams suelen aparecer como tarjetas y permiten una visualización enriquecida desde la aplicación.

En las secciones siguientes se describe cómo enviar contenido de archivo como interacción directa del usuario, como el envío de un mensaje. El SDK de Teams proporciona rutas de actividad para controlar flujos de trabajo de consentimiento de archivos, incluidos file.consent.accept y file.consent.decline.

Configuración del agente para admitir archivos

Para enviar y recibir archivos en el agente, establezca la supportsFiles propiedad del manifiesto trueen . Esta propiedad se describe en la sección bots de la referencia del manifiesto.

La definición tiene este aspecto, "supportsFiles": true. Si el agente no habilita supportsFiles, las características enumeradas en esta sección no funcionan.

Recibir archivos en un chat personal

Cuando un usuario envía un archivo al agente, el archivo se carga por primera vez en el almacenamiento de OneDrive para la Empresa del usuario. A continuación, el agente recibe una actividad de mensaje que notifica al usuario sobre la carga del usuario. La actividad contiene metadatos de archivo, como es su nombre y la dirección URL de contenido. El usuario puede leer directamente desde esta dirección URL para capturar su contenido binario.

Ejemplo de actividad de mensaje con datos adjuntos de archivo

El código siguiente muestra un ejemplo de actividad de mensaje con datos adjuntos de archivo:

{
  "attachments": [{
    "contentType": "application/vnd.microsoft.teams.file.download.info",
    "contentUrl": "https://contoso.sharepoint.com/personal/johnadams_contoso_com/Documents/Applications/file_example.txt",
    "name": "file_example.txt",
    "content": {
      "downloadUrl" : "https://download.link",
      "uniqueId": "1150D938-8870-4044-9F2C-5BBDEBA70C9D",
      "fileType": "txt",
      "etag": "123"
    }
  }]
}

En la tabla siguiente se describen las propiedades de contenido de los datos adjuntos:

Propiedad Objetivo
downloadUrl Dirección URL de OneDrive para capturar el contenido del archivo. El usuario puede emitir un HTTP GET directamente desde esta dirección URL.
uniqueId Identificador de archivo único. Este es el identificador del elemento de unidad de OneDrive, en caso de que el usuario envíe un archivo al agente.
fileType Tipo de archivo, como .pdf o .docx.

Como procedimiento recomendado, confirme la carga del archivo mediante el envío de un mensaje al usuario.

Cargar archivos en un chat personal

Para cargar un archivo en un usuario:

  1. Envíe un mensaje al usuario que solicita permiso para escribir el archivo. Este mensaje debe contener FileConsentCard datos adjuntos con el nombre del archivo que se va a cargar.
  2. Si el usuario acepta la descarga de archivos, el agente recibe una actividad de invocación con una dirección URL de ubicación.
  3. Para transferir el archivo, el agente realiza una HTTP POST operación directamente en la dirección URL de ubicación proporcionada.
  4. Opcionalmente, quite la tarjeta de consentimiento original si no desea que el usuario acepte más cargas del mismo archivo.

Mensaje que solicita permiso para cargar

El siguiente mensaje de escritorio contiene un objeto de datos adjuntos simple que solicita permiso de usuario para cargar el archivo:

Tarjeta de consentimiento que solicita permiso de usuario para cargar archivo de

El siguiente mensaje móvil contiene un objeto de datos adjuntos que solicita permiso de usuario para cargar el archivo:

Tarjeta de consentimiento que solicita permiso de usuario para cargar el archivo en el móvil
{
  "attachments": [{
    "contentType": "application/vnd.microsoft.teams.card.file.consent",
    "name": "file_example.txt",
    "content": {
      "description": "<Purpose of the file, such as: this is your monthly expense report>",
      "sizeInBytes": 1029393,
      "acceptContext": {
      },
      "declineContext": {
      }
    }
  }]
}

En la tabla siguiente se describen las propiedades de contenido de los datos adjuntos:

Propiedad Objetivo
description Describe el propósito del archivo o resume su contenido.
sizeInBytes Proporciona al usuario una estimación del tamaño del archivo y la cantidad de espacio que ocupa en OneDrive.
acceptContext Contexto adicional que se transmite silenciosamente al agente cuando el usuario acepta el archivo.
declineContext Contexto adicional que se transmite silenciosamente al agente cuando el usuario rechaza el archivo.

Invocación de la actividad cuando el usuario acepta el archivo

Una actividad de invocación se envía al agente cuando un usuario acepta el archivo. Contiene la dirección URL del marcador de posición OneDrive para la Empresa que el agente puede emitir PUT para transferir el contenido del archivo. Para obtener información sobre cómo cargar en la dirección URL de OneDrive, vea cargar bytes en la sesión de carga.

En el código siguiente se muestra un ejemplo de una versión concisa de la actividad de invocación que recibe el agente:

{
  "name": "fileConsent/invoke",
  "value": {
    "type": "fileUpload",
    "action": "accept",
    "context": {
    },
    "uploadInfo": {
      "contentUrl": "https://contoso.sharepoint.com/personal/johnadams_contoso_com/Documents/Applications/file_example.txt",
      "name": "file_example.txt",
      "uploadUrl": "https://upload.link",
      "uniqueId": "1150D938-8870-4044-9F2C-5BBDEBA70C8C",
      "fileType": "txt",
      "etag": "123"
    }
  }
}

Del mismo modo, si el usuario rechaza el archivo, el agente recibe el siguiente evento con el mismo nombre de actividad general:

{
  "name": "fileConsent/invoke",
  "value": {
    "type": "fileUpload",
    "action": "decline",
    "context": {
    }
  }
}

Notificar al usuario sobre un archivo cargado

Después de cargar un archivo en el OneDrive del usuario, envíe un mensaje de confirmación al usuario. El mensaje debe contener los siguientes datos adjuntos FileCard que el usuario puede seleccionar, ya sea para obtener una vista previa o para abrirlo en OneDrive, o descargarlo localmente:

{
  "attachments": [{
    "contentType": "application/vnd.microsoft.teams.card.file.info",
    "contentUrl": "https://contoso.sharepoint.com/personal/johnadams_contoso_com/Documents/Applications/file_example.txt",
    "name": "file_example.txt",
    "content": {
      "uniqueId": "1150D938-8870-4044-9F2C-5BBDEBA70C8C",
      "fileType": "txt",
    }
  }]
}

En la tabla siguiente se describen las propiedades de contenido de los datos adjuntos:

Propiedad Objetivo
uniqueId Id. de elemento de unidad de OneDrive o SharePoint.
fileType Tipo de archivo, como .pdf o .docx.

Capturar imágenes alineadas del mensaje

Captura de imágenes insertadas que forman parte del mensaje mediante el OnMessage controlador . El SDK de Teams controla la autenticación automáticamente, por lo que puede acceder a las direcciones URL de contenido de datos adjuntos directamente desde el contexto de actividad.

Imagen alineada

En el código siguiente se muestra un ejemplo de captura de imágenes insertadas de un mensaje:

using Microsoft.Teams.Api;
using Microsoft.Teams.Apps;
using Microsoft.Teams.Plugins.AspNetCore.Extensions;

var builder = WebApplication.CreateBuilder(args);
builder.AddTeams();
var app = builder.Build();
var teams = app.UseTeams();

teams.OnMessage(async (context, cancellationToken) =>
{
    var attachment = context.Activity.Attachments?[0];
    if (attachment != null && attachment.ContentType.Contains("image"))
    {
        // Download the inline image from the content URL.
        var client = new HttpClient();
        var responseMessage = await client.GetAsync(attachment.ContentUrl);

        // Save the inline image to Files directory.
        var filePath = Path.Combine("Files", "ImageFromUser.png");
        using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            await responseMessage.Content.CopyToAsync(fileStream);
        }

        // Create reply with the received image.
        var imageData = Convert.ToBase64String(File.ReadAllBytes(filePath));
        var reply = new MessageActivity(
            $"Attachment of {attachment.ContentType} type and size of {responseMessage.Content.Headers.ContentLength} bytes received.");
        reply.AddAttachment(new Attachment
        {
            Name = "ImageFromUser.png",
            ContentType = "image/png",
            ContentUrl = $"data:image/png;base64,{imageData}",
        });
        await context.SendAsync(reply, cancellationToken);
    }
});

app.Run();

Ejemplo básico

En el ejemplo siguiente se muestra cómo controlar el flujo de trabajo de consentimiento de archivos completo, incluido el envío de tarjetas de consentimiento, el control de respuestas aceptadas y rechazadas y la carga de archivos en OneDrive.

El código siguiente envía una tarjeta de consentimiento de archivo al usuario, solicitando permiso para cargar el archivo recibido en su OneDrive:

async Task SendFileConsentCard<T>(IContext<T> context, string fileName, string fileId, int fileSize)
    where T : IActivity
{
    var consentContext = new { filename = fileName, file_id = fileId };

    var fileCard = new FileConsentCard
    {
        Description = "This is the file I want to send you",
        SizeInBytes = fileSize,
        AcceptContext = consentContext,
        DeclineContext = consentContext
    };

    var message = new MessageActivity
    {
        Attachments =
        [
            new Attachment
            {
                Content = fileCard,
                ContentType = new ContentType(ContentTypeFileConsent),
                Name = fileName
            }
        ]
    };
    await context.Send(message);
}

Controlar la carga de archivos

El código siguiente realiza la carga real de archivos después de que el usuario acepte la tarjeta de consentimiento, cargue el contenido en OneDrive y envíe un mensaje de éxito con un archivo adjunto de información. En C#, esta lógica está insertada dentro del OnFileConsent controlador.

async function handleFileUpload(context: any, uploadInfo: FileUploadInfo, fileId: string): Promise<void> {
  try {
    const content = pendingUploads.get(fileId)!;
    pendingUploads.delete(fileId);
    await uploadToOnedrive(uploadInfo.uploadUrl!, content);
    await context.send({
      type: 'message',
      text: `<b>${uploadInfo.name}</b> has been successfully uploaded.`,
      attachments: [{
        content: {
          uniqueId: uploadInfo.uniqueId,
          fileType: uploadInfo.fileType
        },
        contentType: CONTENT_TYPE_FILE_INFO,
        name: uploadInfo.name,
        contentUrl: uploadInfo.contentUrl
      }]
    });
  } catch (e: any) {
    pendingUploads.delete(fileId);
    console.log(`File upload failed: ${e}`);
  }
}

async function uploadToOnedrive(url: string, content: Buffer): Promise<void> {
  const fileSize = content.length;
  const response = await axios.put(url, content, {
    headers: {
      'Content-Type': 'application/octet-stream',
      'Content-Length': fileSize.toString(),
      'Content-Range': `bytes 0-${fileSize - 1}/${fileSize}`
    }
  });
  if (![200, 201].includes(response.status)) {
    throw new Error(`Upload failed with status ${response.status}`);
  }
}

Ejemplo de código

En el ejemplo de código siguiente se muestra cómo obtener el consentimiento de archivos y cargar archivos en Teams desde un agente:

Ejemplo de nombre Descripción .NET Node.js Python
File upload En este ejemplo de agente para Teams se muestran las funcionalidades de carga de archivos mediante El marco del SDK de Teams, lo que permite a los usuarios cargar archivos y ver imágenes insertadas en chats. View View Ver

Consulte también