HttpPostedFileBaseをbyte []に​​変換します


123

私のMVCアプリケーションでは、次のコードを使用してファイルをアップロードしています。

モデル

 public HttpPostedFileBase File { get; set; }

見る

@Html.TextBoxFor(m => m.File, new { type = "file" })

すべて正常に動作していますが、結果フィールドをbyte []に​​変換しようとしています。

コントローラ

 public ActionResult ManagePhotos(ManagePhotos model)
    {
        if (ModelState.IsValid)
        {
            byte[] image = model.File; //Its not working .How can convert this to byte array
        }
     }

回答:


259

Darinが言うように、入力ストリームから読み取ることができますが、一度にすべてのデータが利用可能であることに依存することは避けます。.NET 4を使用している場合、これは簡単です。

MemoryStream target = new MemoryStream();
model.File.InputStream.CopyTo(target);
byte[] data = target.ToArray();

CopyTo必要に応じて、.NET 3.5で同等のものを書くのは簡単です。重要な部分は、HttpPostedFileBase.InputStream

効率的な目的で、返されたストリームがすでにaであるかどうかを確認できますMemoryStream

byte[] data;
using (Stream inputStream = model.File.InputStream)
{
    MemoryStream memoryStream = inputStream as MemoryStream;
    if (memoryStream == null)
    {
        memoryStream = new MemoryStream();
        inputStream.CopyTo(memoryStream);
    }
    data = memoryStream.ToArray();
}

最初の例は.NET4では機能しませんでした(もう1つは試しませんでした)-.pngまたは.jpgで試した場合は機能しませんでしたが、.txtファイルを使用した場合は機能しました。理由:)
VoodooChild

2
@VoodooChild:おそらくあなたがしていることの何かがデータをテキストとして扱うことです。しかし、私は何を知るためにもっと多くのコードを見る必要があるでしょう。完全なシナリオを示す別の質問をすることをお勧めします。
Jon Skeet、

6
わかりました、これは私にいくつかのコンテキストを与えるためにうまくいきました-ありがとう!`画像img = Image.FromStream(file.InputStream); MemoryStream ms = new MemoryStream(); img.Save(ms、ImageFormat.Jpeg); model.SiteLogo = ms.ToArray(); `
VoodooChild

7
inputstreamの位置がストリームの最後にあることがわかりました。そのため、model.File.InputStream.Position = 0;Jonのコードの前にその行を追加して機能させる必要がありました
Manish

2
@UweKeim:ええ、はい、既にusingステートメント(ディレクティブではなく、btw)がinputStreamあり、どちらも同じオブジェクトを参照します。なぜ2回処分したいのですか?
Jon Skeet

27

入力ストリームから読み取ることができます。

public ActionResult ManagePhotos(ManagePhotos model)
{
    if (ModelState.IsValid)
    {
        byte[] image = new byte[model.File.ContentLength];
        model.File.InputStream.Read(image, 0, image.Length); 

        // TODO: Do something with the byte array here
    }
    ...
}

また、ファイルをディスクに直接保存する場合は、このmodel.File.SaveAs方法を使用できます。次のブログ記事が役に立つかもしれません。


5
HttpPostedFileBaseのInputStreamは、Read への1回の呼び出しですべてのデータを返すことが保証されていますか?可能な限り回避することをお勧めします。
Jon Skeet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.