Télécharger l’image du site en .NET / C #

J’essaie de télécharger des images du site. Le code que j’utilise fonctionne bien lorsque l’image est disponible. Si l’image non disponible crée un problème. Comment valider la disponibilité de l’image?

Code:

Méthode 1:

WebRequest requestPic = WebRequest.Create(imageUrl); WebResponse responsePic = requestPic.GetResponse(); Image webImage = Image.FromStream(responsePic.GetResponseStream()); // Error webImage.Save("D:\\Images\\Book\\" + fileName + ".jpg"); 

Méthode 2:

 WebClient client = new WebClient(); Stream stream = client.OpenRead(imageUrl); bitmap = new Bitmap(stream); // Error : Parameter is not valid. stream.Flush(); stream.Close(); client.dispose(); if (bitmap != null) { bitmap.Save("D:\\Images\\" + fileName + ".jpg"); } 

Modifier:

Stream a les déclarations suivantes:

  Length '((System.Net.ConnectStream)(str)).Length' threw an exception of type 'System.NotSupportedException' long {System.NotSupportedException} Position '((System.Net.ConnectStream)(str)).Position' threw an exception of type 'System.NotSupportedException' long {System.NotSupportedException} ReadTimeout 300000 int WriteTimeout 300000 int 

Il n’est pas nécessaire d’impliquer des classes d’images, vous pouvez simplement appeler WebClient.DownloadFile :

 ssortingng localFilename = @"c:\localpath\tofile.jpg"; using(WebClient client = new WebClient()) { client.DownloadFile("http://www.example.com/image.jpg", localFilename); } 

Mettre à jour
Comme vous voudrez vérifier si le fichier existe et télécharger le fichier, il est préférable de le faire dans la même requête. Donc, voici une méthode qui fera cela:

 private static void DownloadRemoteImageFile(ssortingng uri, ssortingng fileName) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Check that the remote file was found. The ContentType // check is performed since a request for a non-existent // image file might be redirected to a 404-page, which would // yield the StatusCode "OK", even though the image was not // found. if ((response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect) && response.ContentType.StartsWith("image",SsortingngComparison.OrdinalIgnoreCase)) { // if the remote file was found, download oit using (Stream inputStream = response.GetResponseStream()) using (Stream outputStream = File.OpenWrite(fileName)) { byte[] buffer = new byte[4096]; int bytesRead; do { bytesRead = inputStream.Read(buffer, 0, buffer.Length); outputStream.Write(buffer, 0, bytesRead); } while (bytesRead != 0); } } } 

En bref, il fait une demande pour le fichier, vérifie que le code de réponse est l’un des suivants: OK , Moved ou Redirect et que ContentType est une image. Si ces conditions sont vraies, le fichier est téléchargé.

J’ai utilisé le code de Fredrik ci-dessus dans un projet avec quelques légères modifications, que je pensais partager:

 private static bool DownloadRemoteImageFile(ssortingng uri, ssortingng fileName) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); HttpWebResponse response; try { response = (HttpWebResponse)request.GetResponse(); } catch (Exception) { return false; } // Check that the remote file was found. The ContentType // check is performed since a request for a non-existent // image file might be redirected to a 404-page, which would // yield the StatusCode "OK", even though the image was not // found. if ((response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect) && response.ContentType.StartsWith("image", SsortingngComparison.OrdinalIgnoreCase)) { // if the remote file was found, download it using (Stream inputStream = response.GetResponseStream()) using (Stream outputStream = File.OpenWrite(fileName)) { byte[] buffer = new byte[4096]; int bytesRead; do { bytesRead = inputStream.Read(buffer, 0, buffer.Length); outputStream.Write(buffer, 0, bytesRead); } while (bytesRead != 0); } return true; } else return false; } 

Les principaux changements sont les suivants:

  • utiliser un try / catch pour le GetResponse () car je courais dans une exception lorsque le fichier distant a renvoyé 404
  • retourner un booléen

Aussi possible d’utiliser la méthode DownloadData

  private byte[] GetImage(ssortingng iconPath) { using (WebClient client = new WebClient()) { byte[] pic = client.DownloadData(iconPath); //ssortingng checkPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +@"\1.png"; //File.WriteAllBytes(checkPath, pic); return pic; } } 
  private static void DownloadRemoteImageFile(ssortingng uri, ssortingng fileName) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if ((response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect) && response.ContentType.StartsWith("image", SsortingngComparison.OrdinalIgnoreCase)) { using (Stream inputStream = response.GetResponseStream()) using (Stream outputStream = File.OpenWrite(fileName)) { byte[] buffer = new byte[4096]; int bytesRead; do { bytesRead = inputStream.Read(buffer, 0, buffer.Length); outputStream.Write(buffer, 0, bytesRead); } while (bytesRead != 0); } } }