2010-05-28 5 views
2

J'utilise le contrôle FileUpload pour faciliter le téléchargement de fichier image sur mon site. Je veux restreindre un utilisateur à télécharger uniquement le fichier image. J'utiliseFile Upload dans asp.net

if (fupFirmLogo.PostedFile.ContentType == "image/Jpeg") 
      { 

      } 

pour vérifier si le fichier est une image ou non. Je veux autoriser toutes les extensions d'image comme PNG, GiF, Jpeg, tif, BMP etc. Comment dois-je faire.

Répondre

1

vous devez utiliser une expression régulière pour valider c'est une image ou non, pourrait être la meilleure option

quelque chose comme:

public static bool IsValidImage(this string fileName) 
    {   
     Regex regex = new Regex(@"(.*?)\.(jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF|bmp|BMP)$"); 
     return regex.IsMatch(fileName); 
    } 

Ensuite, vous vérifiez:

if (fupFirmLogo.FileName.IsValidImage()) 
{ 
    //Do your code 
} 
else 
{ 
    //Not a valid image 
    } 
+4

Impossible un utilisateur peut delibrately changer l'extension du fichier .exe à partir i.e. .jpeg. Je pense que cette méthode va le permettre. –

+0

Je pense que non. Comment pouvez-vous changer le fichier .exe en .jpg? – anishMarokey

+0

Convenu que cela pourrait avoir une vulnérabilité. J'aime bien l'idée de regex. Inclurait regex sur fupFirmLogo.PostedFile.ContentType pour vérifier "^ image /.+$" pour éliminer toute vulnérabilité? – Eddie

1

Vous pourrait définir un éventail de types d'images connues:

public static readonly string[] _imageMimeTypes = new[] { "image/jpeg", "image/png" }; 

puis de vérifier si le type de contenu affiché est dans ce tableau:

if (_imageMimeTypes.Contains(fupFirmLogo.PostedFile.ContentType)) 
{ 
    // ... 
} 
+0

Darin, je pense que combiner votre idée avec AnishMarokey est la meilleure façon de faire.Vérifiez les types MIME, mais faites-le à partir d'une classe commune afin qu'elle soit réutilisable. C'est la méthode que nous utilisons sur nos contrôles de téléchargement de fichiers. – Tommy

0

J'espère que cela va vous aider. Essayez le code ci-dessous.

Image uploadedImage = null; 
    if (ImageUpload.HasFile && ImageUpload.FileName != string.Empty && ImageUpload.FileContent.Length > 0) 
    { 
     try 
     { 
      uploadedImage = Image.FromStream(ImageUpload.PostedFile.InputStream); 
     } 
     catch (Exception ex) 
     { 
      lblUploadStatus.Text = "Selected file is not an image.<br />" + ex.Message; 
     } 

     if (uploadedImage != null) 
     { 
      string savePath = string.Format("{0}/{1}", Server.MapPath("~/images/orig/upload_temp"), ImageUpload.FileName); 
      uploadedImage.Save(savePath, ImageFormat.Jpeg); 
     } 
    } 
0

Le seul problème avec les solutions ci-dessus est que le fichier devra être téléchargé sur le serveur avant de pouvoir vérifier leurs types de fichiers.

Si vous mettez un peu Javascript dans l'appel onSubmit, vous pouvez lire le nom du fichier et le test là, retour faux si ce ne est pas un nom de fichier valide.

Ce sera beaucoup plus facile de votre bande passante.

<form method="post" enctype="multipart/form-data" onsubmit="return submit(this)"> 
    <input id="inputControl" name="file" type="file" /> 
</form> 

Puis

function submit(form) { 
    var fileName = $('#inputControl').val().replace(/.*(\/|\\)/, ''); 
    // check the filename here, return false if its not an image. 
} 
+0

vous avez toujours le je renommé un .exe en .jpg problème ici. Cela va probablement capturer 99% des choses, mais vous avez toujours besoin d'une validation côté serveur. Aussi, qu'en est-il de ceux qui désactivent JS? – Tommy

+0

Ensuite, il sera toujours publier le fichier - l'essentiel est que, dans la majorité des cas, cela réduira les frais généraux de bande passante. Je serais encore à la solution Image.FromStream ci-dessus, mais en commençant de cette façon peut couper beaucoup de problèmes potentiels pour peu d'effort. –

0

Vérification de nom de fichier contre regex pour l'extension de fichier d'image ne convient pas. Les pirates informatiques peuvent utiliser cette fonctionnalité pour promouvoir leurs sites Web. Je l'ai personnellement vécu. Alors, voici comment vous pouvez le faire certain que le fichier téléchargé est une image dans VB.net:

Public Function IsFileAnImage(ByRef uploadedFile As HttpPostedFile) As Boolean 
    Try 
     Dim uploadedImage As Drawing.Image = Drawing.Image.FromStream(uploadedFile.InputStream) 
     uploadedImage.Dispose() 
     Return True 
    Catch 
     Return False 
    End Try 
    End Function 
0

Je sais que c'est vieux mais juste valider le type de contenu. Le type de contenu est juste une chaîne.

if (fupFirmLogo.PostedFile.ContentType.Contains("image/") 
{ 
    //This is an Image 
} 
else 
{ 
    //not and image 
} 

Cela permettra à tout fichier dont le type de contenu commence par "image /" qui est toutes les images.