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?
Vous pouvez vérifier les propriétés de l'objet HttpPostedFileBase
pour cela
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
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;
}
}
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. :)