web-dev-qa-db-ja.com

MVC3 HttpPostedFileBaseが画像かどうかを確認する方法

私はこのようなコントローラーを持っています:

public ActionResult Upload (int id, HttpPostedFileBase uploadFile)
{
....
}

UploadFileが画像(jpg、pngなど)であることを確認するにはどうすればよいですか?

私は試しました

using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..}

これは、bitmapImageを作成できない場合にArgumentExceptionをスローします。

たとえば、uploadFile.FileNameを確認するより良い方法はありますか?

23
Henrik Stenbæk

HttpPostedFileBaseオブジェクトのプロパティでこれを確認できます

  • ContentType
  • FileName(すでに知っているファイル拡張子を確認してください:))

enter image description here

また、ここに小さなメソッドがあります、あなたが使用/拡張できるものを用意しました...

private bool IsImage(HttpPostedFileBase file)
{
    if (file.ContentType.Contains("image"))
    {
        return true; 
    }

    string[] formats = new string[] { ".jpg", ".png", ".gif", ".jpeg" }; // add more if u like...

    // linq from Henrik Stenbæk
    return formats.Any(item => file.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase));
}

私はこれについての記事も書きました here

62
Yasser Shaikh

ファイル名と拡張子、MIMEタイプを確認することもできますが、ユーザーがアップロードする前にファイルの名前を変更するだけなので、信頼できない可能性があります。これは、ファイルの内容を確認することでそれを実現する信頼できる方法です。 https://stackoverflow.com/a/6388927/29407

もちろん、次のように、PNG以外の既知の画像タイプ形式に拡張することもできます。

public class ValidateFileAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        var file = value as HttpPostedFileBase;
        if (file == null)
        {
            return false;
        }

        if (file.ContentLength > 1 * 1024 * 1024)
        {
            return false;
        }

        try
        {
            var allowedFormats = new[] 
            { 
                ImageFormat.Jpeg, 
                ImageFormat.Png, 
                ImageFormat.Gif, 
                ImageFormat.Bmp 
            };

            using (var img = Image.FromStream(file.InputStream))
            {
                return allowedFormats.Contains(img.RawFormat);
            }
        }
        catch { }
        return false;
    }
}
20
Darin Dimitrov

または、html属性 'accept'を介してクライアント側でチェックして、ファイルをできるだけ早くフィルターすることができます。

@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" })

これにより、デフォルトとして、accept属性で定義されたファイルタイプのみが表示されます。注意してください。ユーザーはfiletyeを「すべてのファイル」に変更できます。これを念頭に置いて、これを確認してください:

解決した懸念事項 、拡張機能を確認するためのJavaScriptスニペット、および次のようなボタンを無効にするための編集:

            $('input:submit').attr('disabled', true);

ファイル拡張子が正しくなるまで。それにもかかわらず、サーバー側でチェックされています。 :)

3
Kristian Jay