Ir para o conteúdo

Exemplo de Script – Arquivos em Lote para Download

Este Plugin suporta a capacidade de baixar vários arquivos de um Painel Multi-linha ou Painel de Placa de uma só vez. No evento Business Object em execução, o Plugin fará um loop por todos os registros de Business Object ou tabela para identificar e lote os arquivos apropriados para disponibilizar em um único download.

Quando o Plugin é executado, ele essencialmente pega todos os valores File e FileName correspondentes e os coloca em um arquivo zip. O nome do arquivo zip gerado quando o Plugin é concluído será: "MM/dd/yyyy h:mm tt".zip", que reflete a data e hora em que foi executado e acrescenta a extensão .zip.

Com o exemplo de script fornecido, o script é executado em uma Tabela ou Objeto de Negócios independente de vinculações de nível de painel ou UI. Isso significa que uma vinculação de nível de painel ou vinculação de controle não afeta a tabela subjacente para o Plugin. Isso também significa que tudo o que você deseja fazer, incluindo vinculações no painel ou tabela, precisa ser feito no nível de Objeto de Negócios/Tabela.

Caso de Uso

Este plugin é útil quando você tem um painel em um aplicativo onde deseja disponibilizar vários arquivos para download em uma única ação.

Requisitos

Este Plugin requer que você tenha duas tabelas ou Business Objects existentes, e ambos devem ter colunas File e FileName. Uma delas representa de onde o Plugin está lendo, e a outra representa onde o Plugin está inserindo.

Preferências de Implementação

Você vai querer revisar e modificar a seguinte sintaxe no script para substituir os UUIDs no plugin para refletir os UUIDs reais das tabelas ou Objetos de Negócios que você está referenciando em seu aplicativo.

var importFileTableFilter = tableService.GetTable(Guid.Parse("{{UUID da tabela que contém os arquivos que serão compactados}}")).CreateFilter();

var importZipTableFilter = tableService.GetTable(Guid.Parse("{{UUID da tabela onde o arquivo ZIP será inserido}}")).CreateFilter();

Referências de Plugins

Nota

É possível modificar o script do plugin para capturar outras colunas FileName e File content, mas normalmente a metodologia de nomenclatura determina que a coluna content seja "File" e o nome do arquivo seja "FileName".

Coluna Tipo de dados Descrição
FileName String Coluna contendo nome e extensão do arquivo.
File Binary Coluna com conteúdo de arquivo.

Exemplo de Script

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);