2011-09-18 3 views
2

j'ai le code suivant:Comment savoir si Image.FromStream est complète

var request = (HttpWebRequest)HttpWebRequest.Create(url); 
var response = request.GetResponse(); 
var stream = response.GetResponseStream(); 
if (stream != null) { 
    Image newImage = Image.FromStream(stream, true); 
    pic.Thumb = newImage.ImageToByteArray(); 
} 

Qu'advient-il si les temps de lecture sur? Ou la connexion est interrompue à mi-téléchargement?

Les docs disent qu'il va lancer un ArgumentException si ce n'est pas un format valide ou est nul, mais je ne sais pas s'il va lancer cette exception si l'image n'est que partiellement téléchargée.

Malheureusement, je ne peux pas compter sur l'en-tête de ContentLength pour me dire la bonne taille du fichier, car le serveur est et donne une longueur de contenu plus grand que le fichier est en réalité. Donc mon espoir est que Image.FromStream sera capable de dire si l'image est complète ou non.

Quelqu'un peut-il donner un aperçu ici?

Note: ImageToByteArray est juste une méthode d'extension qui utilise un flux de mémoire pour convertir le Image à un byte[]

MISE À JOUR:

Selon Darin, puis un ExternalException est jeté lorsque vous essayez d'enregistrer l'image . Cependant, mes propres tests dans lesquels j'ai tronqué un fichier image montrent que FromStream lance en fait une ArgumentException si l'image n'est pas le bon nombre d'octets.

Répondre

4

Qu'advient-il si les temps de lecture sur?

Une exception sera levée avant d'entrer la condition if.

Ou la connexion est avorté?

Une exception sera levée avant d'entrer la condition if.

mais je ne sais pas s'il va jeter cette exception si l'image n'est que partiellement téléchargée.

Une image ne peut pas être partiellement téléchargée. Le GetResponseStream est une méthode de blocage qui signifie que soit vous obtenez tout, ou une exception (ou bien sûr dans votre cas, vous pouvez également obtenir une exception si ce que vous les cheveux n'est pas une image, mais une page HTML qui va se passer lorsque vous essayez d'instancier la Image GDI + objet). En guise de note, pour éviter les fuites, vous voudrez probablement également envelopper cette ressource jetable Image dans une instruction .

+0

Bien, cela a du sens. Que se passe-t-il si le serveur n'envoie tout simplement pas une image complète? (Disons qu'ils ont des problèmes de charge et d'obtenir les délais d'attente dans leur back-end, et envoyer simplement une image partielle, mais sinon la connexion est normal) –

+0

@Mystere Man, je ne comprends pas. Vous voulez dire que le serveur envoie un tableau d'octets qui est une image invalide, comme la ressource distante hébergeant une image corrompue? Si oui, alors vous obtiendrez une exception ArgumentException lorsque vous essayez de charger ce flux dans l'objet Image GDI + (méthode Image.FromStream). –

+0

Je veux dire, je ne sais pas si la classe Image va détecter une image partielle comme invalide ou non et lancer l'ArgumentException. –