5

Ho un visualizzatore di alberi che consente all'utente di cercare i file e le sottodirectory, quando l'utente raggiunge un file, il sito Web andrà a https://website.com/path/subpath/file.pdf. Supponendo che io possa identificare che l'utente sta visualizzando un file, si verificherà quanto segue:Come pubblicare un file in MVC senza esporre l'URL?

  • Il controller genererà una chiave SAS per recuperare il file da Azure.
  • Il controller ottenere un URL: https://myaccount.files.core.windows.net/path/?=accesskey

Mentre non v'è alcun problema con l'utente la visualizzazione di questa chiave di accesso, finirà per scadere, e per l'utente di memorizzare la pagina, vorrei l'utente non per essere reindirizzato al percorso Azure, ma per ASP.NET per emettere il file come se l'utente è ancora in https://website.com/path/subpath/file.pdf

Quindi la domanda finale è fondamentalmente:

come può Eseguo un file, senza forzare il download e senza mostrare il percorso del file/url?

risposta

7

Si può provare a leggere il file dalla memoria come matrice di byte e utilizzare il metodo File per restituirlo dal metodo di azione.

public ActionResult View(int id) 
{ 
    // id is a unique id for the file. Use that to get the file from your storage. 
    byte[] byteArrayOfFile=GetFileInByteArrayFormatFromId(id); 
    return File(byteArrayOfFile,"application/pdf"); 
} 

Supponendo GetFileInByteArrayFormatFromId restituisce la versione array di byte del file dopo aver letto dal vostro storage/azzurro. È possibile prendere in considerazione la memorizzazione nella cache di alcuni file nel proprio ambiente in modo che non sia necessario raggiungere l'azzurro per ottenerlo su ogni richiesta.

Se è possibile leggere il file come un flusso di file, il metodo File ha un sovraccarico che prende anche quello

public ActionResult View(int id) 
{ 
    // id is a unique id for the file. Use that to get the file from your storage. 
    FileStream fileStream = GetFileStreamFromId(id);; 
    return File(fileStream, "application/pdf","Myfile.pdf"); 
} 

E se avete il file disponibili nel server (i file memorizzati nella cache), Voi è possibile utilizzare un altro overload del metodo File in cui si passerà il percorso anziché l'array di byte.

public ActionResult View(int id) 
{ 
    var f = Server.MapPath("~/Content/Downloads/sampleFile.pdf"); 
    return File(f,"application/pdf"); 
} 

Se il browser ha il supporto per visualizzare il tipo di contenuto della risposta, la risposta verrà visualizzata nel browser. La maggior parte dei principali browser supporta il rendering di file PDF.

C'è un altro sovraccarico del metodo File che prende il nome del file di download che verrà utilizzato dalla finestra di dialogo di salvataggio/download del browser in modo che l'utente possa salvarlo sul computer locale e/o aprire.

public ActionResult View(int id) 
{ 
    var pathToTheFile=Server.MapPath("~/Content/Downloads/sampleFile.pdf"); 
    return File(pathToTheFile, MimeMapping.GetMimeMapping(pathToTheFile),"Myfile.pdf"); 
} 
public ActionResult ViewFromByteArray(int id) 
{ 
    byte[] byteArrayOfFile=GetFileInByteArrayFormatFromId(id); 
    return File(byteArrayOfFile, "application/pdf","Myfile.pdf"); 
} 

Con questo, l'utente riceverà un prompt di download dal browser.

+0

Azure consente il download diretto come array di byte utilizzando 'file.DownloadToByteArray()' – devSparkle