113 messaggi dal 27 ottobre 2005
Salve a tutti,
secondo voi è possibile con Blazor WebAssembly effettuare il download di un file/documento indicando la cartella sul client di destinazione?

grazie
Stefano
Ciao!
non mi è chiara una cosa.. il file che devi poter scaricare da blazor webassembly dove si trova? nella cartella wwwroot del progetto? viene generato dinamicamente?

se è un file presente nella wwwroot del progetto, una soluzione estremamente semplice è la seguente

<a href="test.jpg" download="test.jpg" target="_blank">
link download
</a>

in questo caso il file test.jpg si trova all'interno della cartella wwwroot.

Se invece il file si trova in una cartella in rete, l'ideale sarebbe avere un server api che espone il file e richiamarlo dall'app blazor webassembly..
113 messaggi dal 27 ottobre 2005
Ciao,
grazie per l'interesse e la risposta.
il file si trova in una specifica cartella del server (virtual directory) e lo scopo principale è di poterlo scaricare sul client in una particolare cartella(directory)

grazie
Stefano
In questo caso un approccio è quello di creare un web server API che permette il download di quel file.. ed eseguire la chiamata da blazor webassembly.

il file deve essere presente nella cartella wwwroot del server o deve essere configurato per nello startup per servire i file presenti in una cartella esterna.

LATO SERVER, codice del controller:

 [ApiController]
    [Route("[controller]")]
    public class FileController : ControllerBase
    {
        private readonly IWebHostEnvironment _hosting;

        public FileController( IWebHostEnvironment hosting)
        {       
            this._hosting = hosting;
        }   

        [HttpGet("Download")]
        public async Task<IActionResult> Download()
        {         
                if (string.IsNullOrWhiteSpace(_hosting.WebRootPath))
                {
                    _hosting.WebRootPath = Path.Combine(_hosting.ContentRootPath, "wwwroot");
                }
                string myFilePath = _hosting.WebRootPath + @"\test.jpg";
                string fileName = "test.jpg";
                byte[] fileBytes = await System.IO.File.ReadAllBytesAsync(myFilePath);
                return File(fileBytes, "application/octet-stream", fileName);    
       
        }
    }

In questo esempio il file che esponi per il download è il file test.jpg

sul client blazor wasm bisogna creare una funzione javascript per il download, qualcosa tipo:

window.SaveFile = (url, fileName) => {
    const anchorElement = document.createElement('a');
    anchorElement.href = url;
    anchorElement.download = fileName ?? '';
    anchorElement.click();
    anchorElement.remove();
}



e richiamarlo dal componente razor:
@inject HttpClient Http
@inject IJSRuntime _JS
@page "/"

<button class="btn btn-info" @onclick="Download">File</button>

@code{
    protected async Task Download()
    {
        var apiAddress = Http.BaseAddress + "File/Download";

        await _JS.InvokeVoidAsync("SaveFile", apiAddress, "test.jpg");
    }
}


Per il salvataggio in una cartella specifica, dipende dal browser che utilizza il client, è una cosa che non puoi controllare a livello di codice (magari mi sbaglio ma non ho trovato nulla in giro..)
113 messaggi dal 27 ottobre 2005
Ti ringrazio ancora ... anche per il codice sorgente.
Avevo adottato anch'io un approccio simile ma poi mi sono fermato sull'argomento principale della mia richiesta/domanda:
come "forzare" lato client il download del file in una specifica directory (sul client)

Anch'io non ho trovato nulla in rete in merito a questo "problema"

grazie
Stefano
Modificato da steual il 22 aprile 2021 13:20 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.