Saltar al contenido

Ejemplo de Script: Archivos por Lotes para Descargar

Este complemento permite descargar varios archivos de un panel de varias filas o de un panel de tablero a la vez. Cuando se ejecuta el evento de objeto comercial, el complemento recorrerá todos los registros de objetos comerciales o tablas para identificar y lote los archivos adecuados para que estén disponibles en una única descarga.

Cuando se ejecuta el complemento, básicamente toma todos los valores de archivo y nombre de archivo correspondientes y los coloca en un archivo zip. El nombre del archivo zip generado cuando finaliza el complemento será: "MM/dd/yyyy h:mm tt".zip", que refleja la fecha y hora en que se ejecutó y agrega la extensión .zip.

Con el ejemplo de secuencia de comandos proporcionado, el secuencia de comandos se ejecuta en una tabla o un objeto comercial independientemente de los enlaces a nivel de panel o de interfaz de usuario. Esto significa que un enlace a nivel de panel o de control no afecta a la tabla subyacente del complemento. Esto también significa que todo lo que desea hacer, incluidos los enlaces en el panel o la tabla, debe realizarse en el nivel de tabla o objeto comercial.

Caso de Uso

Este complemento es útil cuando tienes un panel en una aplicación donde deseas que varios archivos estén disponibles para descargar en una sola acción.

Requisitos

Este complemento requiere que tenga dos tablas u objetos comerciales existentes, y ambos deben tener columnas de Archivo y Nombre de archivo. Una de ellas representa desde dónde lee el complemento y la otra representa dónde inserta el complemento.

Preferencias de Despliegue

Querrá revisar y modificar la siguiente sintaxis en el secuencia de comandos para sustituir los UUID en el complemento para reflejar los UUID reales de las tablas u objetos comerciales a los que hace referencia en su aplicación.

var importFileTableFilter = tableService.GetTable(Guid.Parse("{{UUID de la tabla que contiene los archivos que se van a comprimir}}`")).CreateFilter();

var importZipTableFilter = tableService.GetTable(Guid.Parse("{{UUID de la tabla donde se va a insertar el archivo ZIP}}`")).CreateFilter();

Referencias de Complementos

Nota

Es posible modificar el secuencia de comandos del complemento para capturar otras columnas de contenido de Archivo y Nombre de archivo, pero normalmente la metodología de denominación establece que la columna de contenido sea "Archivo" y el nombre del archivo sea "Nombre de archivo".

Columna Tipo de datos Descripción
FileName String Columna que contiene el nombre y la extensión del archivo.
File Binary Columna con contenido del archivo.

Ejemplo de Secuencia de Comandos

using System.IO;
using System.IO.Compression;
using Vinyl.Sdk.Events;
using Vinyl.Sdk.Filtering;
using System.Linq;
using Vinyl.Sdk;
using System;

var tableService = Services.GetService<ITableService>();
var eventService = Services.GetService<IEventService>();

var importFileTableFilter = tableService.GetTable(Guid.Parse("Table UUID containing files to be compressed")).CreateFilter();
EventTable readFileTable = await eventService.InvokeEventAsync(importFileTableFilter, "filter");
importFileTableFilter.Limit = 0;
EventTable importFileTable = await eventService.InvokeFilterEventAsync(importFileTableFilter);
EventRow rowFile = await eventService.InvokeNewEventAsync(importFileTable);

var importZipTableFilter = tableService.GetTable(Guid.Parse("Table UUID where ZIP file will be inserted")).CreateFilter();
importZipTableFilter.Limit = 0;
EventTable importZipTable = await eventService.InvokeFilterEventAsync(importZipTableFilter);
EventRow rowZip = await eventService.InvokeNewEventAsync(importZipTable);

byte[] fileBytes;
var compressedFileStream = new MemoryStream();
string inspectionID;

using (compressedFileStream)
{
    compressedFileStream.Seek(0, SeekOrigin.Begin);
    using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, false))
    {
       foreach (EventRow row1 in (EventTable)readFileTable)
       {

                //Create a zip entry for each attachment
                var zipEntry = zipArchive.CreateEntry(row1["FileName"].GetValueAsString());

                //Get the stream of the attachment
                using (var originalFileStream = new MemoryStream((byte[])row1["File"].Value))
                {
                    using (var zipEntryStream = zipEntry.Open())
                    {
                        //Copy the attachment stream to the zip entry stream
                        originalFileStream.CopyTo(zipEntryStream);
                    }
                }

        }
    }
  fileBytes = compressedFileStream.ToArray();
}

rowZip["FileName"].Value = DateTime.Now.ToString("MM/dd/yyyy h:mm tt") + ".zip";

rowZip["File"].Value = fileBytes;

await eventService.InvokeInsertEventAsync(rowZip);