2010-06-18 32 views
15

Tôi đang trong quá trình gửi tệp cùng với HttpWebRequest. Tệp của tôi sẽ từ Giao diện người dùng FileUpload. Ở đây tôi cần chuyển đổi File Upload thành filestream để gửi luồng cùng với HttpWebRequest. Làm thế nào để tôi chuyển đổi FileUpload thành một dòng phim?FileUpload to FileStream

+1

gì là bạn thực sự cố gắng để đạt được? –

+1

Tôi cần chuyển tệp từ miền này sang tên miền khác. do đó, hãy tải tệp đã tải lên và gửi nó bằng cách sử dụng HttpWebRequest –

Trả lời

20

Kể từ FileUpload.PostedFile.InputStream mang lại cho tôi Dòng, tôi đã sử dụng đoạn mã sau để chuyển nó sang mảng byte

public static byte[] ReadFully(Stream input) 
{ 
    byte[] buffer = new byte[input.Length]; 
    //byte[] buffer = new byte[16 * 1024]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 
+0

không biết PostedFile có .InputStream .. thanks. – lawphotog

3

Bạn không thể chuyển đổi một FileUpload thành một FileStream. Tuy nhiên, bạn có thể lấy MemoryStream từ thuộc tính PostFile của FileUpload. Sau đó bạn có thể sử dụng MemoryStream đó để điền vào HttpWebRequest của bạn.

+2

Bạn có thể vui lòng xây dựng - có thể với một ví dụ về mã hoặc liên kết không? – PeterX

+0

@PeterX: Xem câu trả lời của Extremeswank cho một ví dụ. – ErikHeemskerk

11

Có thể tốt hơn để ống dòng nhập dữ liệu trực tiếp vào dòng đầu ra:

inputStream.CopyTo(outputStream); 

Bằng cách này, bạn không lưu toàn bộ tệp trong bộ nhớ trước khi truyền lại. Ví dụ, đây là cách bạn sẽ viết nó vào một FileStream:

FileUpload fu; // Get the FileUpload object. 
using (FileStream fs = File.OpenWrite("file.dat")) 
{ 
    fu.PostedFile.InputStream.CopyTo(fs); 
    fs.Flush(); 
} 

Nếu bạn muốn viết nó trực tiếp đến một yêu cầu web, bạn có thể làm như sau:

FileUpload fu; // Get the FileUpload object for the current connection here. 
HttpWebRequest hr; // Set up your outgoing connection here. 
using (Stream s = hr.GetRequestStream()) 
{ 
    fu.PostedFile.InputStream.CopyTo(s); 
    s.Flush(); 
} 

Đó sẽ là hơn hiệu quả, vì bạn sẽ trực tiếp truyền tệp đầu vào tới máy chủ đích, mà không cần lưu bộ nhớ đệm đầu tiên trong bộ nhớ hoặc trên đĩa.

+0

Khi bạn truy cập vào PostFile, tệp đã được đệm hoàn toàn bởi ASP.NET. Điều này chỉ có thể được phá vỡ bằng cách sử dụng 'HttpRequest.GetBufferlessInputStream()' (.NET 4 hoặc cao hơn), nhưng do đó yêu cầu bạn phân tích cú pháp toàn bộ thân yêu cầu. – ErikHeemskerk

1

Bạn có thể đặt một file Tải file lên trực tiếp vào một MemoryStream bằng cách sử dụng FileBytes (giản thể câu trả lời từ Tech Jerk)

using (MemoryStream ms = new MemoryStream(FileUpload1.FileBytes)) 
{ 
    //do stuff 
} 

Hoặc nếu bạn không cần một MemoryStream

byte[] bin = FileUpload1.FileBytes; 
Các vấn đề liên quan