2012-10-29 14 views
8

Ho riscontrato un problema relativo al tipo di trasmissione da HttpInputStream a FileStream.Impossibile eseguire il cast dell'oggetto di tipo 'System.Web.HttpInputStream' per digitare 'System.IO.FileStream' MVC 3

Come ho fatto?

Ho un oggetto HttpPostedFileBase e voglio avere FileStream.

ho scritto:

public void Test(HttpPostedFileBase postedFile) { 
    FileStream fileStream = (FileStream)(postedFile.InputStream); // throw exception 

    FileStream anotherFileStream = postedFile.InputStream as FileStream; // null 
} 

ho provato anche

public void Test(HttpPostedFileBase postedFile) { 
    Stream stream = postedFile.InputStream as Stream; 

    FileStream myFile = (FileStream)stream; 

} 

Ma senza successo.

Perché a postedFile.InputStream viene HttpInputStream tipo?

E come posso risolvere questo problema?

Grazie

+0

tuo (flusso in entrata) file di base InputStream è HttpInputStream , non FileStream. Devi leggerlo e salvarlo da qualche parte, magari nel tuo file locale. Per questo è possibile utilizzare FileStream. – OzrenTkalcecKrznaric

risposta

7

Il flusso che si ottiene dalla vostra chiamata HTTP è di sola lettura sequenziale (non ricercabile) e la FileStream è ricercabile in lettura/scrittura. Sarà necessario prima leggere l'intero flusso dalla chiamata HTTP in una matrice di byte, quindi creare il FileStream da quella matrice.

+11

Un esempio puoi fornire? –

1

È possibile utilizzare il metodo .SaveAs per salvare il contenuto del file. HttpInputSteam probabilmente perché è caricato tramite http [Browser]

postedFile.SaveAs("Full Path to file name"); 

È inoltre possibile utilizzare CopyTo

FileStream f = new FileStream(fullPath, FileMode.CreateNew); 
postedFile.InputStream.CopyTo(f); 
f.Close(); 
+3

Non voglio salvare ... –

14
public byte[] LoadUploadedFile(HttpPostedFileBase uploadedFile) 
{ 
    var buf = new byte[uploadedFile.InputStream.Length]; 
    uploadedFile.InputStream.Read(buf, 0, (int)uploadedFile.InputStream.Length); 
    return buf; 
} 
+1

Grazie mille. Salvato il mio tempo –

6

Ho usato il seguente e ha funzionato bene per la stessa situazione

MemoryStream streamIWant = new MemoryStream(); 
using (Stream mystream = (Stream)AmazonS3Service.GetObjectStream(AWSAlbumBucketName, ObjectId))                
{ 
    mystream.CopyTo(streamIWant); 
} 
return streamIWant; 

Il GetObjectStream restituisce lo stesso tipo di corda menzionato nella questione.

+0

"CopyTo" ha funzionato per me. Grazie. – ShaileshDev

0

Di seguito il codice ha funzionato per me ..

Utilizzare un oggetto BinaryReader per restituire un array di byte dal flusso di simile:

byte[] fileData = null; 
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream)) 
{ 
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength); 
} 

How to create byte array from HttpPostedFile

Problemi correlati