web-dev-qa-db-fra.com

MVC3 Comment vérifier si HttpPostedFileBase est une image

J'ai un contrôleur comme celui-ci:

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

Comment puis-je m'assurer que uploadFile est une image (jpg, png etc.)

J'ai essayé avec

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

qui lève une ArgumentException si bitmapImage ne peut pas être créé.

Existe-t-il un meilleur moyen, par exemple, en consultant uploadFile.FileName?

23
Henrik Stenbæk

Vous pouvez vérifier les propriétés de l'objet HttpPostedFileBase pour cela

  • ContentType
  • FileName (vérifiez les extensions de fichier, que vous connaissez déjà :))

enter image description here

Voici également une petite méthode, que j'ai préparée que vous pouvez utiliser/étendre ...

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

J'ai également écrit un article à ce sujet ici

62
Yasser Shaikh

Vous pouvez vérifier le nom et l'extension du fichier et le type MIME, mais cela peut ne pas être fiable car l'utilisateur peut simplement renommer le fichier avant de le télécharger. Voici un moyen fiable d'y parvenir en consultant le contenu du fichier: https://stackoverflow.com/a/6388927/29407

Vous pouvez bien sûr l'étendre à d'autres formats de type d'image connus que PNG, comme ceci:

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

Ou vous pouvez le vérifier côté client via l'attribut html "accepter" pour filtrer le fichier dès que possible:

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

cela ne montrera que les types de fichiers définis par défaut dans votre attribut accept. Attention, l'utilisateur peut toujours changer filetye en "Tous les fichiers", dans cet esprit, mieux vérifier ceci:

Problème résol , un extrait javascript pour vérifier l'extension, puis faire quelques modifications pour désactiver le bouton comme:

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

jusqu'à ce que l'extension de fichier soit correcte. le faire néanmoins vérifier côté serveur. :)

3
Kristian Jay