2012-10-29 132 views
8

我遇到了有關從HttpInputStream到FileStream的投射類型的問題。無法將類型爲'System.Web.HttpInputStream'的對象轉換爲鍵入'System.IO.FileStream'MVC 3

我是怎麼做到的?

我有一個HttpPostedFileBase對象,我想擁有FileStream。

我寫道:

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

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

我也試過

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

    FileStream myFile = (FileStream)stream; 

} 

但沒有成功。

爲什麼在postedFile.InputStream來到HttpInputStream類型?

我該如何解決這個問題?

感謝

+0

你的文件庫的InputStream(進來的流)是HttpInputStream ,而不是FileStream。你必須從中讀取並保存到某個地方,或者保存到本地文件。爲此,您可以使用FileStream。 – OzrenTkalcecKrznaric

回答

7

您從HTTP調用得到的是隻讀的順序(非可查找)流和FileStream是可讀/可寫的。您需要首先從HTTP調用中讀取整個流成一個字節數組,然後從該數組創建FileStream。

+11

您可以提供一個示例嗎? –

1

可以使用.SaveAs方法來保存文件的內容。 HttpInputSteam可能是因爲它是通過http上傳[瀏覽]

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

您還可以使用CopyTo

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

我不想保存... –

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

非常感謝。保存我的時間 –

6

我用下面的和它的工作就好了同樣的情況

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

的GetObjectStream返回在問題中提到的相同類型的字符串。

+0

「CopyTo」爲我工作。謝謝。 – ShaileshDev

0

下面的代碼爲我工作..

使用BinaryReader在對象從流返回一個字節數組,如:

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

相關問題