Filetype vérifier dans VB.NET?
J'ai une image redimensionnée programme et il fonctionne. Le problème est que lorsqu'un utilisateur sélectionne une image de fichier dans la boîte de dialogue de sélection de fichier, il se bloque. Comment puis-je vérifier pour les fichiers d'image?
Connexes: C# Comment puis-je tester un fichier est un fichier jpeg?. Votre problème est très similaire, vous avez juste à ajouter des contrôles supplémentaires si vous voulez soutenir d'autres formats.
Je suis à l'aide de VB C#.
La meilleure façon d'obtenir ce que vous wnat est ce qui est suggéré par 0xA3. Envelopper l'Image.FromFile dans un bloc Try. Si c'est une image valide, vous obtiendrez l'image de sortie. Si ce n'est pas une image valide, vous obtiendrez un dépassement de mémoire Exception et votre code sera en sécurité.
(encore une fois): Si vous insistez, vous voulez VB, de vérifier ma solution.
Je suis à l'aide de VB C#.
La meilleure façon d'obtenir ce que vous wnat est ce qui est suggéré par 0xA3. Envelopper l'Image.FromFile dans un bloc Try. Si c'est une image valide, vous obtiendrez l'image de sortie. Si ce n'est pas une image valide, vous obtiendrez un dépassement de mémoire Exception et votre code sera en sécurité.
(encore une fois): Si vous insistez, vous voulez VB, de vérifier ma solution.
OriginalL'auteur Moshe | 2010-08-24
Vous devez vous connecter pour publier un commentaire.
Voici l'VB.NET l'équivalent de 0xA3 réponse depuis l'OP a insisté sur une version de visual basic.
Vous l'utilisez comme suit:
Edit:
Je ne vous recommande pas de vérifier les extensions de fichier. N'importe qui peut enregistrer un autre fichier (document texte par exemple) avec un
.jpg
d'extension et de vous tromper application dans beleiving c'est une image.La meilleure façon est de charger l'image à l'aide de la fonction ci-dessus ou à l'ouverture de la première quelques octets et vérifier pour le format de signature.
Vous pouvez trouver plus d'informations sur les fichiers JPEG et leurs en-têtes ici:
Normalement, je n'aurais pas fait cela, mais l'OP a insisté, donc je devais le faire. Vous méritez le crédit de toute façon que vous avez répondu plus tôt.
OriginalL'auteur Alex Essilfie
Un très primitive vérifier est de simplement essayer de charger l'image. Si elle n'est pas valable un
OutOfMemoryException
sera levée:Si j'ai bien compris votre question votre application, il va charger l'image de toute façon. Donc simplement d'emballage de l'opération de chargement dans un bloc try/catch ne signifie pas que toute charge supplémentaire. Pour l'VB.NET la solution de cette approche vérifier la réponse par @Alex Essilfie.
Ceux se demandant pourquoi
Image.FromFile
est en train de jeter un OOM sur les fichiers non valides doivent lire la réponse de Hans Passant à la question suivante:Tao: La raison pour cela est la cartographie de l'ancien code d'erreur Windows 3 (FILE_NOT_FOUND) qui est renvoyée par le natif de GDI+ fonction chargement de l'image (les codes d'erreur sont assez limités et il n'était pas facile d'en ajouter de nouveaux, comme INVALID_IMAGE_FORMAT). Je ne sais pas exactement pourquoi il a été cartographiés à un
OutOfMemoryException
mais je suppose que il y a des raisons pour cela.OriginalL'auteur Dirk Vollmar
Votre première ligne de défense, bien sûr, serait tout simplement de vérifier l'extension du fichier:
Mieux encore, SLC suggère dans un commentaire, l'ensemble de votre boîte de dialogue
Filter
propriété:Ce n'est pas une garantie -- idéalement, vous voulez vérifier le fichier lui-même pour vérifier que c'est une image, et, théoriquement, vous devez également être en mesure de charger les fichiers avec des valeurs anomales extensions si ils sont en fait des fichiers d'image (peut-être il suffit de demander à l'utilisateur de l'accusé de réception de la première) - mais c'est un début facile.
Il serait préférable de vérifier pour d'autres cas, les variantes de l'extension à l'aide de
string.Equals(ext, ".jpg", StringComparison.InvariantCultureIgnoreCase)
.Bref peu de méthodes comme cela, j'ai tendance à aller avec
ToLower
car elle est moins saisissant que l'écriture potentiellement plusieursstring.Equals
les appels de méthode.ToLower()
est très bien pour de simples échantillons de ce genre. Cependant, non seulement qu'un nouvel objet string est créé, il n'est pas sûr et se trompe jamais sur les Turquie Test. Au moins on devrait utiliserToLowerInvariant()
dans le code de production.Oui, une nouvelle chaîne est créé; mais considérant qu'il s'agit probablement de 3 à 5 caractères, je ne serais pas la sueur. Il est encore largement préférable (à mon avis) pour taper
ext.Equals(".jpg", StringComparison.InvariantCultureIgnoreCase) || ext.Equals(".jpeg", StringComparison.InvariantCultureIgnoreCase) || [...]
-- de toute évidence, la performance est critique scénario, les choses seraient différentes. J'avais oublié à propos de la Turquie test, si!OriginalL'auteur Dan Tao
VB et C# réponses sont grands, mais aussi contenir une "chasse aux sorcières" si vous prévoyez de modifier ou de déplacer le fichier: les créa 'img' objet permet de verrouiller le fichier image, à moins que la méthode dispose() est invoquée pour la libérer. Voir ci-dessous:
OriginalL'auteur Jim M
Le plus robuste serait de comprendre les signatures des fichiers dont vous avez besoin pour charger.
JPEG a un format d'en-tête, par exemple.
De cette façon, votre code ne sera pas aussi facilement berner si vous il suffit de regarder l'extension.
163 réponse devrait vous obtenez la plupart de la voie le long de ces lignes.
un simple filtre extension serait un bon début, mais vous voulez quelque chose comme ça après, juste pour s'assurer que les fichiers renommés ne pas glisser à travers, mais bien sûr, encapsulation tous à l'intérieur d'une instruction try/catch serait un test pour vous assurer que le résultat ne sera pas le plantage de votre programme. Le plus de la vérification des erreurs, le mieux (à un certain degré de toute façon).
OriginalL'auteur John