6

私は自分のコントローラーを持っています

[HttpPost]
public ActionResult ChangeAvatar(HttpPostedFileBase file)
{
    AvatarHelper.AvatarUpdate(file, User.Identity.Name);
    return RedirectToAction("Index", "Profile");
}

そして、ファイルが jpeg/png 形式であるかどうかを既に確認しています。

private static bool IsImage(string contentType)
{   
  return AllowedFormats.Any(format => contentType.EndsWith(format,   
             StringComparison.OrdinalIgnoreCase));
}

public static List<string> AllowedFormats
{
    get { return new List<string>() {".jpg", ".png", ".jpeg"}; }
}

必要なもの-アップロードされたファイルが実際の画像ファイルであり、画像拡張子を持つtxtファイルではないことを確認してください。

アップロードしたファイルを次のように変換します。

using (var image = System.Drawing.Image.FromStream(postedFile.InputStream))
{
          ///image stuff
}

入力ストリームから画像を作成するときに try/catch ブロックを考えていますが、それを行う良い方法はありますか? ありがとう)

PS

ファイルが実際の画像かどうかを確認する別の (try/catch ブロックのより効率的な方法) 方法があるのだろうか?

4

2 に答える 2

5

RawFormat次のプロパティを使用できます。

private static ImageFormat[] ValidFormats = new[] { ImageFormat.Jpeg, ImageFormat.Png };
public bool IsValid(Stream image)
{
    try
    {
        using (var img = Image.FromStream(file.InputStream))
        {
            return ValidFormats.Contains(img.RawFormat);
        }
    }
    catch
    {
        return false;
    }
}

また、 で示したように、この検証ロジックを再利用可能な検証属性に入れることもできますthis post

于 2013-03-11T11:29:34.800 に答える
2

base64文字列が画像かどうかを実際にチェックする拡張機能としての私のソリューション:

public static bool IsImage(this string base64String)
    {
        byte[] imageBytes = Convert.FromBase64String(base64String);

        var stream = new MemoryStream(imageBytes, 0, imageBytes.Length);
        try
        {
            stream.Write(imageBytes, 0, imageBytes.Length);
            System.Drawing.Image image = System.Drawing.Image.FromStream(stream, true);
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

使用法:

if(!"base64string".IsImage())
     throw new Exception("Not an image");
于 2013-06-21T16:39:43.943 に答える