How to?

Como modelar uma action para fazer download de um ficheiro?

Para modelar uma action que faz download de ficheiros é necessário seguir os seguintes passos:

  • 1 - Modelar uma ServiceAction no modelo de Serviços
  • 2 - Escolher o ResponseType da ServiceAction (o recomendado é "blob")
  • 3 - Fazer override do método criado para a ServiceAction
  • 4 - Usar a action numa View ou Operation no modelo de Apresentação

O exemplo seguinte demonstra a modelação de uma action para fazer download de um Report da Quotation através de um Button.

1 & 2 -Modelar Service Action

ServiceAction

3 - Fazer override ao método gerado

protected override async Task<HttpResponseMessage> OnDownloadReportAsync(Guid id, [FromBody] string version)
    {
        // Get the printing service
        Primavera.Core.ApplicationServices.IPrintingService printingService =
            ApplicationService.Resolve<Primavera.Core.ApplicationServices.IPrintingService>();

        // 
        System.IO.Stream stream = await printingService.PrintAsync("Sales", "Quotations", id.ToString(), "Sales_QuotationReport");
        HttpResponseMessage response = this.Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StreamContent(stream);


        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
        response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = "Quotation.pdf";
        response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
        return response;
    }

Nota: neste exemplo, como é para fazer o download de um report, a stream vem do método printingService.PrintAsync, a stream pode vir de qualquer lado.

Importante: adicionar os headers à resposta tal como neste exemplo, o header ContentType deve ser definido de acordo com o tipo de ficheiro.

4 - Utilizar service action numa editor view

EditorView

A Service Action também pode ser utilizada em Secondary & Context Actions:

ContextAction