2015-10-02 14 views
5

Sto tentando di restituire un'immagine da una route del server, ma ne ottengo una che è 0 byte. Sospetto che abbia qualcosa a che fare con il modo in cui utilizzo lo MemoryStream. Ecco il mio codice:Non riceve dati dalla route C#

[HttpGet] 
[Route("edit")] 
public async Task<HttpResponseMessage> Edit(int pdfFileId) 
{ 
    var pdf = await PdfFileModel.PdfDbOps.QueryAsync((p => p.Id == pdfFileId)); 

    IEnumerable<Image> pdfPagesAsImages = PdfOperations.PdfToImages(pdf.Data, 500); 
    MemoryStream imageMemoryStream = new MemoryStream(); 
    pdfPagesAsImages.First().Save(imageMemoryStream, ImageFormat.Png); 

    HttpResponseMessage response = new HttpResponseMessage(); 
    response.Content = new StreamContent(imageMemoryStream); 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png"); 
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = pdf.Filename, 
     DispositionType = "attachment" 
    }; 
    return response; 
} 

Attraverso il debug Ho verificato che il metodo PdfToImages sta lavorando e che imageMemoryStream si riempie con i dati dalla linea

pdfPagesAsImages.First().Save(imageMemoryStream, ImageFormat.Png); 

Tuttavia nella gestione di esso, ricevo un allegato che è correttamente chiamato ma è 0 byte. Cosa devo cambiare per poter ricevere l'intero file? Penso che sia qualcosa di semplice ma non sono sicuro di cosa. Grazie in anticipo.

+0

Forse è necessario impostare la posizione del flusso su 0? 'imageMemoryStream.Position = 0;' –

risposta

2

Dopo aver scritto al MemoryStream, Flush è quindi impostare Position-0:

imageMemoryStream.Flush(); 
imageMemoryStream.Position = 0; 
0

Si dovrebbe tornare indietro MemoryStream all'inizio prima di passarlo alla risposta. Ma è meglio usare PushStreamContent:

HttpResponseMessage response = new HttpResponseMessage(); 
response.Content = new PushStreamContent(async (stream, content, context) => 
    { 
    var pdf = await PdfFileModel.PdfDbOps.QueryAsync(p => p.Id == pdfFileId); 
    content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = pdf.Filename, 
     DispositionType = "attachment" 
    }; 

    PdfOperations.PdfToImages(pdf.Data, 500).First().Save(stream, ImageFormat.Png); 
    }, "image/png"); 
return response; 
+0

Qual è il mandato per l'utilizzo di 'PushStreamContent'? –

+0

Non è necessario allocare memoria aggiuntiva per 'MemoryStream'. –

+0

Nel testare il codice viene fornito in linea, non come allegato. Qualche idea sul perché? –

Problemi correlati