web-dev-qa-db-ja.com

FileStreamへのFileUpload

私はHttpWebRequestとともにファイルを送信しています。私のファイルはFileUpload UIからのものになります。ここでは、HttpWebRequestと共にストリームを送信するために、ファイルアップロードをファイルストリームに変換する必要があります。 FileUploadをファイルストリームに変換するにはどうすればよいですか?

15
Gopi

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

入力ストリームを出力ストリームに直接パイプする方がよい場合があります。

inputStream.CopyTo(outputStream);

この方法では、再送信する前にファイル全体をメモリにキャッシュしません。たとえば、これをFileStreamに書き込む方法を次に示します。

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

別のWebリクエストに直接書き込む場合は、次のようにします。

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

最初にメモリまたはディスクにキャッシュすることなく、入力ファイルを宛先ホストに直接ストリーミングするため、これはより効率的です。

11
Extremeswank

FileUploadをFileStreamに変換することはできません。ただし、そのFileUploadのPostedFileプロパティからMemoryStreamを取得できます。次に、そのMemoryStreamを使用してHttpWebRequestに入力できます。

3
ErikHeemskerk

MemoryStreamを使用すると、FileUploadファイルをFileBytesに直接配置できます(Tech Jerkからの簡単な回答)

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

または、memoryStreamが必要ない場合

byte[] bin = FileUpload1.FileBytes;
3
VDWWD