FileUpload to FileStream

Estou em processo de enviar o arquivo junto com o HttpWebRequest. Meu arquivo será da UI do FileUpload. Aqui eu preciso converter o arquivo de upload para filestream para enviar o stream junto com HttpWebRequest. Como converto o FileUpload em um stream de arquivos?

Desde FileUpload.PostedFile.InputStream me dá Stream, usei o seguinte código para convertê-lo em matriz de bytes

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

Pode ser melhor canalizar o stream de input diretamente para o stream de saída:

 inputStream.CopyTo(outputStream); 

Dessa forma, você não está armazenando em cache todo o arquivo na memory antes da retransmissão. Por exemplo, aqui está como você iria escrever para um FileStream:

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

Se você quisesse escrevê-lo diretamente para outra solicitação da web, poderia fazer o seguinte:

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

Isso será mais eficiente, já que você estará transmitindo diretamente o arquivo de input para o host de destino, sem primeiro armazenar em cache na memory ou no disco.

Você não pode converter um FileUpload em um FileStream. Você pode, no entanto, obter um MemoryStream da propriedade PostedFile do FileUpload. Você pode então usar esse MemoryStream para preencher o seu HttpWebRequest.

Você pode colocar um arquivo FileUpload diretamente em um MemoryStream usando FileBytes (resposta simplificada do Tech Jerk)

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

Ou se você não precisa de um memoryStream

 byte[] bin = FileUpload1.FileBytes;