8791 sujets

Développement web côté serveur, CMS

Bonjour,

j'aimerai savoir si il existe une fonction ou bien une méthode pour uploader une image sur son serveur depuis une url, par exemple je veux récupérer l'image http://www.yahoo.com/image.jpg et l'uploader sur mon serveur.

Certains forums permette de faire ça pour l'upload d'avatar , imageshack le fait aussi, mais j'ai trouvé aucun tuto là dessus.. si quelqu'un connait la marche pour faire ca simplement et "proprement" je suis preneur. Smiley smile

Merci d'avance pour votre aide. Smiley biggrin
Modifié par bru (08 Sep 2007 - 00:58)
Voici un script qui te permettra d'uploader une image à partir d'un formulaire ou à partir d'une URL. Tu dois simplement modifier le répertoire de destination ($repertoire) :

 <?php
 $script_name = "images.php";
 $repertoire = "../img/";
 
 if($mode=="copy") // Copier une image depuis une URL
 {

	echo "<h2>Copie d'image</h2>\n";
	
	$er=0;
	if(!preg_match('/^(http:\/\/)?([\w\-\.]+)\:?([0-9]*)\/(.*)$/', $url, $url_ary)) $er=1;
	if(empty($url_ary[4])) $er=1;
	
	if($er==1) {
?><form name="form1" method="post" action="<? echo $script_name; ?>">
<p><b><font color="red">URL incomplète:</font></b>    
  <input name="url" type="text" id="url" size="100" value="<? echo $url; ?>">
    <input type="submit" name="Submit" value="Copier">
    <input name="mode" type="hidden" id="mode" value="copy"> 
   <a href="<? echo $script_name; ?>">Annuler</a></p>
</form>
 <?php
	}
	else
	{
		$maxsize = 100000;
		
		$base_filename = substr($url_ary[4],strrpos($url_ary[4],"/")+1);
	
		$base_get = '/' . $url_ary[4];
		$port = ( !empty($url_ary[3]) ) ? $url_ary[3] : 80;

		if($base_filename=="") die("<h2>Impossible de télécharger l'image...</h2><p>Erreur de récupération du nom.</p></body></html>");

		if ( !($fsock = fsockopen($url_ary[2], $port, $errno, $errstr)) )
		{
			die("<h2>Impossible de télécharger l'image...</h2><p>Pas de connexion.</p></body></html>");
		}

		fputs($fsock, "GET $base_get HTTP/1.1\r\n");
		fputs($fsock, "Host: " . $url_ary[2] . "\r\n");
		fputs($fsock, "Accept-Language: fr\r\n");
		fputs($fsock, "Accept-Encoding: none\r\n");
		fputs($fsock, "User-Agent: PHP\r\n");
		fputs($fsock, "Connection: close\r\n\r\n");

		unset($data);
		while( !feof($fsock) )
		{
			$data .= fread($fsock, $maxsize);
		}
		fclose($fsock);

		if (!preg_match('#Content-Length\: ([0-9]+)[^ /][\s]+#i', $data, $file_data1) || !preg_match('#Content-Type\: image/[x\-]*([a-z]+)[\s]+#i', $data, $file_data2))
		{
			die("<h2>Impossible de télécharger l'image...</h2><p>Aucune donnée.</p></body></html>");
		}

		$filesize = $file_data1[1]; 
		$filetype = $file_data2[1]; 

		if ( !$error && $filesize > 0 && $filesize < $maxsize )
		{
			$data = substr($data, strlen($data) - $filesize, $filesize);

			$filename = $repertoire.$base_filename;

			if(file_exists($filename)) echo "<p>Le fichier de destination ".$base_filename." existe déjà !</p>";
			else
			{
				$fptr = fopen($filename, 'wb');
				$bytes_written = fwrite($fptr, $data, $filesize);
				fclose($fptr);
		
				if ( $bytes_written != $filesize )
				{
					unlink($tmp_filename);
					die("<h2>Impossible de télécharger l'image...</h2><p>Echec d'écriture.</p></body></html>");
				}
				echo "<p>".$base_filename." enregistré avec succès ! <img src='".$repertoire.$base_filename."'></p>";
			}
		}
		else
		{
			die("<h2>Impossible de télécharger l'image...</h2><p>Fichier trop gros.</p></body></html>");
		}
	}
 }
 
 if($mode=="upload") // Envoyer une image
 {
	
	echo "<h2>Upload d'image</h2>\n";
	
	$extensions_ok = array('png', 'gif', 'jpg', 'jpeg'); 
	$taille_max = 100000;  
	// vérifications 
	if( !in_array( strtolower(substr(strrchr($_FILES['file']['name'], '.'), 1)), $extensions_ok) ) 
	{ 
		$erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !'; 
	} 
	elseif( file_exists($_FILES['file']['tmp_name']) 
		and filesize($_FILES['file']['tmp_name']) > $taille_max) 
	{ 
		$erreur = 'Votre fichier doit faire moins de 500Ko !'; 
	} 
	// copie du fichier 
	if(!isset($erreur)) 
	{ 
		$dest_fichier = basename($_FILES['file']['name']); 
		// formatage nom fichier 
		// enlever les accents 
		$dest_fichier = strtr($dest_fichier, 
		'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
		'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); 
		// remplacer les caracteres autres que lettres, chiffres et point par _ 
		$dest_fichier = preg_replace('/([^.a-z0-1]+)/i', '_', $dest_fichier); 
		//vérif
		if(file_exists($repertoire.$dest_fichier)) echo "<p>Le fichier de destination existe déjà !</p>";
		else {
			// copie du fichier 
			move_uploaded_file($_FILES['file']['tmp_name'], $repertoire.$dest_fichier); 
			echo "<p>".$dest_fichier." envoyé avec succès ! <img src='".$repertoire.$dest_fichier."'></p>";
		}
	} 
	else{ 
		echo "<p>".$erreur."</p>"; 
	} 
	
 }
 
 if($mode=="del") // Supprimer une image
 {
 	if(!isset($file)) die("<h2>Aucun nom de fichier !</h2></body></html>");
	
	if(!file_exists($repertoire.$file)) die("<h2>Fichier inexistant !</h2></body></html>");
	
	if(isset($confirm))
	{
		if($confirm+10<time()) die("<h2>L'action a expirée...</h2></body></html>");
	
		unlink($repertoire.$file);
	
		echo "<h2>Entrée supprimée !</h2>";
	}
	else
	{
		echo "<h2>Supression d'une image ?</h2>\n";
		echo "<p>Vous êtes sur le point de supprimer l'image '".$file."' qui ressemble à ça: <img src='".$repertoire.$file."'><br>";
		echo "<b>Etes-vous sûr de vouloir continuer ?<br><font size=\"5\">";
		echo "<a href='".$script_name."?mode=del&file=".$file."&confirm=".time()."'><font color='red'>Oui</font></a> - ";
		echo "<a href='".$script_name."'><font color='green'>Non</font></a></font></b></p>\n";
	}
 }
 ?>
 
<h2>Ajout d'images</h2>
<form name="form1" method="post" action="<? echo $script_name; ?>">
<p>Copier une image depuis une URL: 
    <input name="url" type="text" id="url" value="http://" size="100">
    <input type="submit" name="Submit" value="Copier">
    <input name="mode" type="hidden" id="mode" value="copy">
</p>
</form>
<form action="<? echo $script_name; ?>" method="post" enctype="multipart/form-data" name="form2">
<p>Envoyer une image:
  <input name="file" type="file" size="100">     
  <input type="submit" name="Submit" value="Envoyer">
  <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
  <input name="mode" type="hidden" id="mode" value="upload">
</p>
</form>
Super, merci beaucoup ça marche nikel faut juste que je fasse une petite modification pour générer un nom aleatoire à limage et c'est parfait.

Merci encore pour ton aide. Smiley cligne
Bonjour à tous,

Ce script est très intéressant. Cependant, je cherche à modifier le nom de l'image que l'on upload.

je suppose que ca doit se jouer sur cette ligne

$dest_fichier = basename($_FILES['file']['name']);

mais je n'ai aucune idée du comment de la chose.

Si une personne pouvait me mettre sur la voie...

En vous remerciant par avance
Bonne journée
Salut,

pour de l'aleatoire c'est la fonction rand qui sert basiquement.

usage simple rand(10,15) paf un chiffre entre 10 et 15

ord convertit un caractere en chiffre ASCII

et char vis-versa

donc faisons un texte de 8 lettres alphabetiques aleatoires :

$dest_fichier = '';
for ($i=0;$i<8;$i++) {
$dest_fichier .= chr(ord(a) + rand(26));
}


bien sur tu peux complexifier. prendre des majuscules ou rajouter des chiffres a toi de voir.


autre ligne importante du code celle qui va placer le fichier:

move_uploaded_file($_FILES['file']['tmp_name'],$repertoire.$dest_fichier); 


tu dois placer le code changeant $dest_fichier entre cette ligne et celle que tu cites.

bien sur certaines lignes ne servent plus comme celle convertissant les accents du nom d'origine.
Modifié par CPascal (14 Aug 2008 - 22:46)
Bonjour,
Je trouve se script très intéressant aussi car sa me permettrait d'uploader des fichier sur mon site sans passer par mon ordinateur, ceux qui me ferait gagner beaucoup de temps.
Mai j'aimerais savoir si on pouvait l'utiliser avec des fichier comme .ZIP, .RAR, .AVI, .FLV . Car j'ai essayer de le modifier pour qu'il prenne en compte c'est extension mais je n'est pas réussi.

$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');



Par

$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'flv', 'zip', 'avi', 'rar');


Sa me permettrai de gagner beaucoup de temps si vous pourriez m'éclairer car sa fait des jours que je cherche. Smiley decu

Le script n'a pas besoin d'être sécuriser car il ne serait utiliser que par moi.

Voila je vous remercie pour d'avance pour vos réponse... Smiley ravi
Salut,

pour l'envoi le fait de rajouter les extensions devrait suffire (peut-être faudra-t-il également augmenter la valeur de $taille_max).

Pour l'upload il faut remplacer
if (!preg_match('#Content-Length\: ([0-9]+)[^ /][\s]+#i', $data, $file_data1) || !preg_match('#Content-Type\: image/[x\-]*([a-z]+)[\s]+#i', $data, $file_data2))
par
if (!preg_match('#Content-Length\: ([0-9]+)[^ /][\s]+#i', $data, $file_data1))
(peut-être faudra-t-il également augmenter la valeur de $maxsize).


Sinon ce script est un peu "vieillissant" :

* il faudrait remplacer les <? par <?php

* il ne fonctionne que si register_globals est à ON (cf. Google au besoin).

* le mode "del" est testé mais est absent du formulaire.

* le code html généré est invalide (ce qui n'a pas grande importance si ce n'est que pour ton usage).

A+
Super !!
C'est génial sa marche! Smiley ravi

Je te remercie beaucoup.

Même si c'est un peu vieillissant on peut dire que c'est bien pratique Smiley biggrin .

Merci encore Heyoan
Je reviens avec une petite question Smiley ravi

Es que c'est possible de uploader une url mai en passant par le FTP (toujours en passant par le php), car les upload autrement sont limiter suivant l'hébergeur.
Connaissez vous un script qui le permet ?
Ou alors es que vous connaissez une commande FTP qui le permette dans FileZilla ?
Ou alors connaissez vous tout simplement un logiciel qui le permette ?

Je cherche beaucoup mais sur internet presque pas de sujet sur sa. Smiley decu

Merci beaucoup d'avance. Smiley cligne
nico9219 a écrit :

Es que c'est possible de uploader une url mai en passant par le FTP (toujours en passant par le php), car les upload autrement sont limiter suivant l'hébergeur.
[...]
Je cherche beaucoup mais sur internet presque pas de sujet sur sa.

Faut dire que c'est pas très clair ^^

PHP possède des fonctions pour ouvrir une connection FTP et faire du transfert FTP (sans passer par le système d'upload et donc sans se soucier du max_uploaded_size).
Mais je n'ai pas de script tout fait sous la main...

Mais comme j'ai pas compris la question, je réponds peut-être à coté de la plaque, pardon.
Bonjour
a écrit :
Faut dire que c'est pas très clair ^^


Lol je suis désoler j'avais du mal a m'exprimer Smiley ravi .

a écrit :
PHP possède des fonctions pour ouvrir une connection FTP et faire du transfert FTP (sans passer par le système d'upload et donc sans se soucier du max_uploaded_size).


Pourtant tu a tout a fait compris se que je voulait dire, Félicitations lol.
Oui voila c'est sa que je veux faire, ouvrir une connections FTP Dans du PHP et uploader un fichier par une URL.

Je ne trouve aucun script, je trouve des script pour le FTP mais il n'upload pas par URL se qui m'aide pas Smiley confus .

Et moi sa serait vraiment un script tout simple qu'il me faut, pas besoin qu'il soit sécuriser ni rien car il n'y a que moi qui en aura accès.

Désoler si je me suis encore mal exprimer Smiley sweatdrop .
Je ne sais pas si ftp_put accepte les upload depuis un protocole http mais peut-être serais-ce une solution.

Sinon, est-ce que tu a accès au ftp de tes sources (le serveur où se trouve tes fichiers) ? Si tel est le cas alors il est possible de faire un transfert de FTP à FTP.
Alors, Oui j'ai accès eu FTP de mon site, (pour renseignement je suis héberger cher "Infomaniak").
Mais que veut tu dire en disant "FTP de tes source" ?

Autrement comment se mettre en place le FTP_PUT, et Aussi si on peut lui rajouter l'upload en URL ?