FileUpload в FileStream

Я отправляю файл вместе с HttpWebRequest. Мой файл будет из пользовательского интерфейса FileUpload. Здесь мне нужно преобразовать загрузку файла в файловый поток, чтобы отправить поток вместе с HttpWebRequest. Как преобразовать FileUpload в файловый поток?


person Gopi    schedule 18.06.2010    source источник
comment
Чего вы на самом деле пытаетесь достичь?   -  person this. __curious_geek    schedule 21.06.2010
comment
Мне нужно перенести файл с одного домена на другой. поэтому получите загруженный файл и отправьте его с помощью HttpWebRequest   -  person Gopi    schedule 21.06.2010


Ответы (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();
    }
}
person Gopi    schedule 21.06.2010

Может быть лучше направить входной поток непосредственно в выходной поток:

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

Это будет более эффективно, так как вы будете напрямую передавать входной файл на целевой хост без предварительного кэширования в памяти или на диске.

person Extremeswank    schedule 09.07.2010
comment
Как только вы получаете доступ к PostedFile, файл уже полностью буферизован ASP.NET. Это можно обойти только с помощью HttpRequest.GetBufferlessInputStream() (.NET 4 или выше), но это, в свою очередь, требует от вас самостоятельного анализа всего тела запроса. - person ErikHeemskerk; 29.03.2012

Вы не можете преобразовать FileUpload в FileStream. Однако вы можете получить MemoryStream из свойства PostedFile этого FileUpload. Затем вы можете использовать этот MemoryStream для заполнения вашего HttpWebRequest.

person ErikHeemskerk    schedule 18.06.2010
comment
Не могли бы вы уточнить - возможно, с примером кода или ссылкой? - person PeterX; 20.09.2013
comment
@PeterX: см. пример ответа Extremeswank. - person ErikHeemskerk; 23.09.2013

Вы можете поместить файл FileUpload непосредственно в MemoryStream, используя FileBytes (упрощенный ответ от Tech Jerk)

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

Или если вам не нужен memoryStream

byte[] bin = FileUpload1.FileBytes;
person VDWWD    schedule 31.03.2017