2012-10-29 10 views
8

Napotkałem problem dotyczący typu rzutowania z HttpInputStream do FileStream.Nie można rzutować obiektu typu "System.Web.HttpInputStream", aby wpisać "System.IO.FileStream" MVC 3

Jak to zrobiłem?

Mam obiekt HttpPostedFileBase i chcę mieć FileStream.

pisałem:

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

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

Próbowałem też

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

    FileStream myFile = (FileStream)stream; 

} 

ale bez sukcesu.

Dlaczego pod postedFile.InputStream pochodzi HttpInputStream typ?

Jak mogę rozwiązać ten problem?

Dzięki

+0

Państwa (strumień przychodzących) baza plik InputStream jest HttpInputStream , a nie FileStream. Musisz przeczytać z niego i zapisać go gdzieś, może do lokalnego pliku. Do tego możesz użyć FileStream. – OzrenTkalcecKrznaric

Odpowiedz

7

strumienia, który otrzymuje się od wywołania HTTP jest tylko do odczytu sekwencyjnego (nie da się przewijać) i FileStream jest dostępny do odczytu i zapisu. Najpierw musisz odczytać cały strumień z wywołania HTTP do tablicy bajtów, a następnie utworzyć obiekt FileStream z tej tablicy.

+11

Przykład możesz podać? –

1

Można użyć metody .SaveAs zapisać zawartość pliku. HttpInputSteam prawdopodobnie dlatego, że przesłaniu przez http [przeglądarka]

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

Można również użyć CopyTo

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

Nie chcę zapisać ... –

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

Wielkie dzięki. Zaoszczędziłem czas –

6

użyłem następujących i to działało dobrze dla tej samej sytuacji

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

GetObjectStream zwraca ten sam typ łańcucha wymieniony w pytaniu.

+0

"CopyTo" pracował dla mnie. Dzięki. – ShaileshDev

0

poniższy kod pracował dla mnie ..

Użycie obiektu BinaryReader zwraca tablicę bajtów ze strumienia jak:

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

Powiązane problemy