25

次のようなコントローラーがあります。

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

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

私は試してみました

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

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

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

4

3 に答える 3

64

HttpPostedFileBaseこれについては、オブジェクトのプロパティを確認できます

  • コンテンツ タイプ
  • FileName (既に知っているファイル拡張子を確認してください:))

ここに画像の説明を入力

また、ここに小さな方法があります。使用/拡張できるものを用意しました...

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

こちらにも記事を書いています

于 2012-08-25T08:00:50.370 に答える
20

ファイル名と拡張子、および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;
    }
}
于 2012-08-25T08:32:06.453 に答える
4

または、クライアント側で html 属性 'accept' を使用して確認し、ファイルをできるだけ早くフィルタリングすることもできます。

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

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

解決された懸念 、拡張機能を確認する JavaScript スニペット、および次のような編集を行ってボタンを無効にします。

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

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

于 2014-01-03T03:25:15.980 に答える