8796 sujets

Développement web côté serveur, CMS

Bonjour,
je suis debutant en php et j'aimerais savoir comment envoyer à la volé sur un serveur ftp un fichier contenu dans une url (je voudrais en quelque sorte que mon serveur soit une passerelle entre les 2 serveurs http -> ftp).
J'aimerais pouvoir transferer n'importe quel fichier (.rar, .zip, .exe, .jpg ...) et de n'importe quel taille (jusqu'à 10go)

J'ai vu dans ce forum et un autre 2 morceau de script intéressant mais je suis incapable de les mettre en commun pour que ca marche :


$handler = fopen($url_file, "r");
$contents = '';
if($handler)
while(!feof($handler))
$contents .= fread($handler, 8192);
fclose($handler);
$handlew = fopen("/home/ton_fichier.ext", "w");
fwrite($handlew, $contents);
fclose($handlew);



Et ce script pour copier un fichier image:

<?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>


Merci beaucoup pour votre aide !!!!
Modifié par molsy26 (09 Nov 2008 - 15:40)
Vers un ftp?
Tu veux dire une adresse en ftp://login:password@adress:port ?

Regarde du coté des fonctions ftp_*

Par contre, pour la taille, tu risque de te retrouver bloqué à un moment, par la configuration php de ton server ou de ton ftp... Tu ne peux en aucuns cas contourner les limitations de taille de ces derniers.
Si le server sur lequel tu veux accéder par protocole ftp est un server dédié, le plus simple est encore d'exécuter un script sur CE server (php ou autre) qui lui, va récupérer les fichier depuis ton server source.

Ainsi, pour éviter les problèmes de timeout sur les gros fichiers, tu pourra utiliser un système de partitionnage.

Tu as toutes les cartes en main, avec la doc pour tenter quelque chose.

Alors, essaye, en commençant par envoyer un seul fichier dont l'adresse serait "écrite en dur" directement dans le code, pour te faire la main.
Non le serveur dedié c'est celui qui est l'intermédiaire. Mon idée était par exemple de prendre un fichier (depuis une url et de l'envoyer sur free)
Modifié par molsy26 (09 Nov 2008 - 21:15)
Et en faisant un

$dist = fopen('ton fichier distant', 'rb');

$ftp = ftp_connect('ton server ftp');

ftp_login($ftp, 'ftp user', 'ftp password');

ftp_fput($ftp, $dist, 'ton fichier une fois sur le ftp', $dist, FTP_BINARY);


?
Merci bien mais pour je n'arrive pas a le faire marcher sur le ftp de dl.free.fr, il me dit qu'il n'arrive pas à se connecter au serveur alors que j'ai tout bien mis:
ftp: dl.free.fr
user : email
mdp : n'importe quoi
port 21
essaye ces différentes valeures, et différentes combinaisons:

ftp: dl.free.fr, ftpperso.free.fr
user: tonsite.free.fr, tonsite@free.fr, tonsite

Mais de mémoire, free ne permet plus de faire des connexions distantes sur son ftp.

reste à voir si tu peux ouvrir un socket vers une page free.fr, si oui, il te resterait une solution alternative.
oui et j'aimerais bien savoir comment le faire marcher, est-ce une option a mettre?
Modifié par molsy26 (10 Nov 2008 - 21:02)