2010-08-17 9 views
7

Est-il possible d'obtenir la taille d'une image (probablement sa taille en octets) à partir d'un serveur web, sans la charger?Obtenir la taille d'une image sans la charger depuis un serveur web

Les serveurs Web ont-ils des propriétés (champs) accessibles en ce qui concerne la taille des fichiers? Cela permettrait de vérifier la taille de l'image sans chargement.

Souvent, lorsque le répertoire d'un serveur Web est chargé dans un navigateur, il indique la taille de chaque fichier, côté serveur. Puis-je, en tant que développeur ASP, accéder à ces données?

J'utilise C# .Net 4

Edit: Je suis en tant que client et demandant cette information d'autres serveurs Web.

Appréciez toute aide, comme toujours. Alex

Répondre

11

Voulez-vous dire quand vous êtes le serveur ou le client?

Si vous êtes le serveur, vous pouvez trouver ce que vous pourriez trouver sur n'importe quel autre fichier (en supposant que le flux d'image provient d'un fichier).

new FileInfo(path).Length; 

Si vous voulez dire que vous faites le code client (vous accédez à un autre serveur web)

Faites une demande HEAD. Bien que certains serveurs ne se comportent pas correctement, la réponse correcte à un HEAD est à peu près identique à celle d'un GET, sauf que l'entité n'est pas envoyée.

Par exemple, pour obtenir le PNG sprite qui est utilisé sur cette page, le navigateur fait un GET à http://sstatic.net/stackoverflow/img/sprites.png qui se traduit par la réponse:

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 17 Aug 2010 01:06:21 GMT 
Content-Type: image/png 
Connection: keep-alive 
Cache-Control: max-age=604800 
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT 
Accept-Ranges: bytes 
X-Powered-By: ASP.NET 
Content-Length: 18607 

suivi par les octets du fichier image réelle.

Faire une tête au lieu d'obtenir des résultats dans un:

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 17 Aug 2010 01:07:20 GMT 
Content-Type: image/png 
Connection: keep-alive 
Cache-Control: max-age=604800 
Content-Length: 18607 
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT 
Accept-Ranges: bytes 
X-Powered-By: ASP.NET 

à peu près la même mais sans le corps d'entité. À ce stade, nous pouvons voir que l'image a une taille de 18607 octets, sans pour autant la télécharger. Cette méthode ne fonctionnera pas si l'image est envoyée en bloc, car alors la longueur du contenu ne sera pas envoyée dans un en-tête.

Edit:

Il est intéressant de souligner, que, parfois, avec un contenu chunked vous aurez pas d'autre choix que de télécharger le tout, parce que le serveur ne sera pas dire (et savez peut-être même pas) la taille quand il commence envoi. Malheureusement, ceci est susceptible d'être utilisé avec des cours d'eau particulièrement importants. Heureusement, il est peu probable que cela soit utilisé avec des images.

+0

J'agis en tant que client oui. Donc le FileInfo ne fonctionnera pas alors je vois. HEAD info est la voie à suivre, malgré les pièges mentionnés ici. – Alex

+1

Vous ne voulez pas dire 18607 octets de taille? – jeffora

+0

LOL. J'ai copié-collé afin que je ne puisse pas mal le taper, puis j'ai copié-collé le max-age par erreur. Fixe, merci. –

2
System.IO.FileInfo fi = new System.IO.FileInfo(filepath); 
fi.Length(); 

Psst, un soupçon: http://www.google.ca/#hl=en&source=hp&q=c%23+get+file+size&aq=f&aqi=g4g-m2&aql=&oq=&gs_rfai=&fp=e6a957a020d2d8f6

Si vous avez besoin/envie de le faire strictement par HTTP, vous devriez essayer d'attraper l'en-tête Content-Length qui vient avec la demande. Il se peut qu'il ne soit pas toujours là, donc vous devrez expérimenter cela et vous assurer que le serveur web indique avec précision la longueur du fichier. Si c'est une image d'un script par exemple, l'en-tête Content-Length peut être manquant (dans ce cas, honte à quelqu'un).

Si Content-Length est manquant, alors je suis sûr qu'il n'y a aucun moyen de déterminer la taille du fichier via HTTP sans le télécharger. Les en-têtes Content-Length sont utilisés pour exactement ce genre de chose.

+0

.. Nouvelles fantastiques. J'ai eu l'idée de vérifier l'en-tête HTTP, et vous l'avez parfaitement défini via Content-Length. Nous pouvons toujours ignorer les données d'en-tête douteuses, mais nous espérons que la majeure partie du contenu sera disponible. Merci ... vous permettra de savoir comment ça se passe quand je mets en place demain. Son 2.16am ici !!! :) – Alex

+0

Honte à personne s'il est envoyé avec 'Transfer-Encoding: Chunked', alors il NE DOIT PAS (dans le sens RFC 2119 d'un" DOIT PAS "capitalisé) être envoyé, et s'il a été envoyé, il DOIT être ignoré. –

+0

System.IO.FileInfo fonctionne-t-il avec des données Web ou uniquement des données locales? Le chemin du fichier peut-il être un URI? – Alex

1

De nombreux serveurs Web ne desservent pas le champ Longueur de contenu. Vous devrez vous assurer que votre code est tolérant à cela.

Questions connexes