2012-10-29 22 views
8

Tôi đã gặp sự cố liên quan đến loại truyền từ HttpInputStream đến FileStream.Không thể truyền đối tượng thuộc loại 'System.Web.HttpInputStream' để nhập 'System.IO.FileStream' MVC 3

Tôi đã làm như thế nào?

Tôi có đối tượng HttpPostedFileBase và tôi muốn có FileStream.

tôi đã viết:

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

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

Tôi cũng đã cố gắng

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

    FileStream myFile = (FileStream)stream; 

} 

Nhưng không thành công.

Tại sao tại postedFile.InputStream đến HttpInputStream loại?

Và làm cách nào tôi có thể giải quyết vấn đề này?

Cảm ơn

+0

của bạn (dòng incomming) cơ sở tập InputStream là HttpInputStream , không phải FileStream. Bạn phải đọc từ nó và lưu nó ở đâu đó, có thể vào tập tin địa phương của bạn. Đối với điều này, bạn có thể sử dụng FileStream. – OzrenTkalcecKrznaric

Trả lời

7

Các dòng mà bạn nhận được từ cuộc gọi HTTP của bạn là chỉ đọc tuần tự (không seekable) và FileStream là đọc/ghi có thể tìm kiếm được. Trước tiên, bạn cần đọc toàn bộ luồng từ cuộc gọi HTTP vào một mảng byte, sau đó tạo FileStream từ mảng đó.

+11

Ví dụ bạn có thể cung cấp? –

1

Bạn có thể sử dụng phương pháp .SaveAs để lưu các nội dung tập tin. HttpInputSteam có lẽ vì nó tải lên thông qua http [trình duyệt]

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

Bạn cũng có thể sử dụng CopyTo

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

Tôi không muốn lưu ... –

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

Cảm ơn rất nhiều. Đã lưu thời gian của tôi –

6

tôi đã sử dụng sau đây và nó chỉ làm việc tốt cho cùng một tình huống

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

Các GetObjectStream trả về cùng một loại chuỗi đề cập trong câu hỏi.

+0

"CopyTo" đã hoạt động cho tôi. Cảm ơn. – ShaileshDev

0

Dưới đây đang làm việc cho tôi ..

Sử dụng một đối tượng BinaryReader để trả về một mảng byte từ dòng như:

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

Các vấn đề liên quan