2011-06-30 15 views
9

Ho un collegamento per il download nella mia pagina, in un file generato dalla richiesta dell'utente. Ora voglio visualizzare le dimensioni del file, in modo che il browser possa visualizzare quanto tempo è rimasto da scaricare. Come soluzione, suppongo che aggiungere un header alla richiesta funzionerebbe, ma ora non so come farlo.Come aggiungere intestazioni nella risposta HTTPContext in ASP.NET MVC 3?

Ecco il mio codice try:

public FileStreamResult DownloadSignalRecord(long id, long powerPlantID, long generatingUnitID) 
     { 

       SignalRepository sr = new SignalRepository(); 
       var file = sr.GetRecordFile(powerPlantID, generatingUnitID, id); 
       Stream stream = new MemoryStream(file); 

       HttpContext.Response.AddHeader("Content-Length", file.Length.ToString()); 

       return File(stream, "binary/RFX", sr.GetRecordName(powerPlantID, generatingUnitID, id) + ".rfx"); 


     } 

Quando ho controllato il violinista, non visualizzare l'intestazione Content-Length. Ragazzi potreste aiutarmi?

risposta

11

Prova HttpContext.Current.Response.AppendHeader("Content-Length", contentLength);

+0

L'attuale non esiste all'interno HttpContext. –

+1

OK, quindi omettere 'Corrente'. Basta usare 'AppendHeader' invece di' AddHeader' nel codice originale. – Mrchief

0

Non so cos'altro potrebbe essere sbagliato lì, ma che il contenuto di lunghezza dovrebbe essere la dimensione del binario, non è la lunghezza della stringa.

+0

In realtà la lunghezza dovrebbe essere la lunghezza del flusso, che sarebbe la lunghezza del file binario, giusto? –

+0

@ Mikael ........... Sì – heisenberg

3

Potete per favore provare il seguente codice e vedere se funziona?

public FileStreamResult Index() 
{ 
    HttpContext.Response.AddHeader("test", "val"); 
    var file = System.IO.File.Open(Server.MapPath("~/Web.config"), FileMode.Open); 
    HttpContext.Response.AddHeader("Content-Length", file.Length.ToString()); 
    return File(file, "text", "Web.config"); 
} 

"funziona sulla mia macchina"

e ho provato senza l'intestazione Content-length e Fiddler riporta un colpo di testa lunghezza del contenuto in ogni caso. Non penso sia necessario.

+0

Il tuo esempio ha funzionato, ma quando ho generato il mio file, non succede. ;/ –

+0

Hai controllato che il flusso contenga effettivamente qualcosa? 'sr.GetRecordFile (..)' restituisce un 'byte []', giusto? –

0

Questo dovrebbe risolverlo poiché ritengo che non sia necessario utilizzare lo FileStreamResult, quando è possibile utilizzare direttamente lo byte[].

public FileContentResult DownloadSignalRecord(long id, long powerPlantID, long generatingUnitID) 
{ 
    SignalRepository sr = new SignalRepository(); 
    var file = sr.GetRecordFile(powerPlantID, generatingUnitID, id); 

    HttpContext.Response.AddHeader("Content-Length", file.Length.ToString()); 

    return File(file, "binary/RFX", sr.GetRecordName(powerPlantID, generatingUnitID, id) + ".rfx"); 
} 

Annotare il tipo di ritorno FileContentResult.

10

Provare a utilizzare

HttpContext.Response.Headers.add("Content-Length", file.Length.ToString()); 
Problemi correlati