Enregistrer une image d'un site distant

Contenu du snippet

Cette class permet d'enregistrer localement une image d'un site web.
Il faut pour cela connaître l'adresse (URL) exacte de l'image (voir WebPage).

Source / Exemple :


<?php
	class WebImage {
		private $sHost; 
		private $sPath = "/";
		private $sUrl;
		private $sFile;
		private $sReferer;
		private $iCode;                                              // réponse du serveur
		private $aHeader = Array();                                  // entête de la réponse du serveur
		private $sData = "";                                         // donnée de l'image
		private $aLinksToImages = Array();                           // tableau contenant les liens vers les images
		private $bExist = false;                                     // l'image n'existe pas encore
		private $sFolderRoot = "../distant/";                         // dossier contenant les sous dossier
		
		
		//############################## accesseur ##########################################
		function getHost() { return $this->sHost;}
		function getFile() { return $this->sFile;}
		function getArrayOfLinksToImages() { return $this->aLinksToImages;}
		function isSaved() { return $this->bExist;}			
		//############################## constructeur ##########################################
		function __construct ( $sUrlImage, $sUrlPage) 
		{
			$this->sUrl = $sUrlImage;                                // adresse de l'image
			$this->sReferer = $sUrlPage;                             // adresse de la page de l'image
			$aTmp = explode("/", $sUrlImage);
						
			$this->sHost = $aTmp[0];                                 // nom du site distant
			$this->sFile = $aTmp[sizeof($aTmp)-1];                   // nom de l'image
		
			for ($i=1;$i < sizeof($aTmp)-1;$i++) {                   // chemin vers le dossier de l'image
				$iPos_Interrogation = strpos($aTmp[$i], "?");
				if ($iPos_Interrogation === false) {                 // si on trouve pas de "?"
					$this->sPath .=  $aTmp[$i] . "/";                // ajout de tous les dossiers
				}
				else {
					$i = sizeof($aTmp);                              // arrêt de la boucle
				}
			}
			
		}
		
		// renvoi un tableau avec l'entête et l'image
		function Save() {
			if (!file_exists($this->sFolderRoot.$this->sPath.$this->sFile) ) {
				
				$rFp = fsockopen($this->sHost, 80, $errno, $errstr, 30);
				if (!$rFp) {
					return 404; // en cas d'erreur de flux, on renvoi le code 404 "Page Not Found"
				} else {
							
					fputs($rFp, "GET ".$this->sPath.$this->sFile." HTTP/1.1\r\n");
					fputs($rFp, "Host: ".$this->sHost."\r\n");
					fputs($rFp, "Referer: ".$this->sReferer."\r\n");
					fputs($rFp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
					fputs($rFp, "\r\n");
			
					$bInHeader = true;
				
					while (!feof($rFp)) {
						// récupération des données
						$sLigne = fgets($rFp, 4096); 
						
						if ($bInHeader == true) {
							$this->aHeader[] = $sLigne; 
							// on récupère le code sur la première ligne qui est comme ceci : HTTP/1.1 200 OK
							$aTmpCode = explode(" ", $this->aHeader[0]);
							$this->iCode = $aTmpCode[1];
						}
						else {
							// si l'image est trouvée (HTP/1.1 200 OK)
							if ($this->iCode == 200) {
								$this->sData .= $sLigne;
							}
						}
					
						if ( (strlen($sLigne) < 3)  && ($bInHeader == true) ) {
							$bInHeader = false;
						}
				}
					fclose($rFp);
			
					// enregistrement du fichier
					$sFolder = str_replace("/", "", $this->sPath)."/";
					$filename = $this->sFolderRoot.$sFolder.$this->sFile;      // chemin complet vers l'image
									
					// création du dossier
					if (!file_exists($this->sFolderRoot.$sFolder."/")) {
						mkdir($this->sFolderRoot."/".$sFolder, 0777);
					}
				
					// écriture du fichier
					if (!$handle = fopen($filename, 'wb')) {
						return false;
					}	
					if (fwrite($handle, $this->sData) === FALSE) {
						return false;
					}
					fclose($handle);
				
					// vérification
					if (file_exists($filename)) {
						$this->bExist = true;
					}	
				}
				// return
				return true;
			}
			else {
				$this->bExist = true;
			}
			
		}
		
		// renvoi le chemin vers le fichier downloadé
		function showImage() {
			$sFolder = str_replace("/", "", $this->sPath)."/";
			return $this->sFolderRoot.$sFolder.$this->sFile;
		}
		
		function Resize() {
			
		}
		
		
	}
?>

Conclusion :


ne me tappez pas ... :-D

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.