2010-06-18 85 views
15

我正在与HttpWebRequest一起发送文件。我的文件将来自FileUpload用户界面。在这里,我需要将文件上传转换为文件流,以便与HttpWebRequest一起发送流。我如何将FileUpload转换为文件流?FileUpload到FileStream

+1

什么是你真正想要实现 ? – 2010-06-21 06:32:23

+1

我需要将文件从一个域传输到另一个域。所以得到上传的文件,并发送使用HttpWebRequest – 2010-06-21 10:31:15

回答

20

由于FileUpload.PostedFile.InputStream给我流时,我用下面的代码以将其转换到字节数组

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

不知道PostedFile有.InputStream ..谢谢。 – lawphotog 2015-08-20 10:12:16

3

您无法将FileUpload转换为FileStream。但是,您可以从FileUpload的PostsFile属性获取MemoryStream。然后您可以使用该MemoryStream来填充您的HttpWebRequest。

+2

请你详细说明 - 可能与代码示例或链接? – PeterX 2013-09-20 06:41:44

+0

@PeterX:查看Extremeswank的答案。 – ErikHeemskerk 2013-09-23 09:18:57

11

可能更好管输入流直接到输出流:

inputStream.CopyTo(outputStream); 

这样,您不会在重新传输之前将整个文件缓存在内存中。例如,这里是你如何将它写入一个FileStream:

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

如果你想把它直接写入到另一个网络请求,你可以做到以下几点:

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(); 
} 

会更因为您将直接将输入文件流式传输到目标主机,而无需先在内存或磁盘上进行缓存。

+0

访问过PostFile后,该文件已被ASP.NET完全缓存。这只能通过使用'HttpRequest.GetBufferlessInputStream()'(.NET 4或更高版本)来规避,但这又要求你自己解析整个请求主体。 – ErikHeemskerk 2012-03-28 20:23:25

1

您可以直接把文件上传文件到MemoryStream使用FileBytes(从技术挺举简化的答案)

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

或者,如果你并不需要一个MemoryStream

byte[] bin = FileUpload1.FileBytes;