Я отправляю файл вместе с HttpWebRequest. Мой файл будет из пользовательского интерфейса FileUpload. Здесь мне нужно преобразовать загрузку файла в файловый поток, чтобы отправить поток вместе с HttpWebRequest. Как преобразовать FileUpload в файловый поток?
FileUpload в FileStream
Ответы (4)
Поскольку FileUpload.PostedFile.InputStream дает мне Stream, я использовал следующий код, чтобы преобразовать его в массив байтов.
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();
}
}
Может быть лучше направить входной поток непосредственно в выходной поток:
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();
}
Это будет более эффективно, так как вы будете напрямую передавать входной файл на целевой хост без предварительного кэширования в памяти или на диске.
HttpRequest.GetBufferlessInputStream()
(.NET 4 или выше), но это, в свою очередь, требует от вас самостоятельного анализа всего тела запроса.
- person ErikHeemskerk; 29.03.2012
Вы не можете преобразовать FileUpload в FileStream. Однако вы можете получить MemoryStream из свойства PostedFile этого FileUpload. Затем вы можете использовать этот MemoryStream для заполнения вашего HttpWebRequest.
Вы можете поместить файл FileUpload непосредственно в MemoryStream
, используя FileBytes
(упрощенный ответ от Tech Jerk)
using (MemoryStream ms = new MemoryStream(FileUpload1.FileBytes))
{
//do stuff
}
Или если вам не нужен memoryStream
byte[] bin = FileUpload1.FileBytes;