Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/04/2007, 20h26   #1
Membre actif
 
Avatar de elcoyotos
 
Inscription : octobre 2006
Messages : 297
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : octobre 2006
Messages : 297
Points : 175
Points : 175
Par défaut [cURL] et hébergeur online comment faire un upload ?

Bonjour,

Un de mes clients à besoin d'uploader des fichiers par le bias de son BACKOFFICE.

Mon client est chez l'hébéergeur ONLINE.

Ce dernier limite l'upload à 2 méga maxi (et encore ça passe une fois sur 5).

La bibliothèque FTP est désactivée.

A force de chercher, j'ai fini par trouver sur la FAQ d'ONLINE que pour l'upload, il fallait utiliser le module CURL.

Après moult recherche, je tombe toujours sur le même résultat ...
Code :
1
2
3
4
5
6
7
8
9
 
<?php
$ch = curl_init('http://www.developpez.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
... qui m'affiche la page http://www.developpez.com

Quelqu'un pourrait-il m'indiquer comment faire un script d'upload en utilisant le module CURL ?

Merci d'avance à ceux qui auront quelques instants à me consacrer
elcoyotos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 01h43   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Je dois avoir ça en stock :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function curl_ftp_put($url, $nom_local, $ascii_mode = FALSE)
{
    $ret = FALSE;
 
    if (is_file($nom_local)) {
        $fp = fopen($nom_local, 'r');
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_INFILE, $fp);
        curl_setopt($ch, CURLOPT_INFILESIZE, filesize($nom_local));
        curl_setopt($ch, CURLOPT_UPLOAD, TRUE);
        if ($ascii_mode) {
            curl_setopt($ch, CURLOPT_TRANSFERTEXT, TRUE);
        }
        $ret = curl_exec($ch);
        curl_close($ch);
        fclose($fp);
    }
 
    return $ret;
}
 
if (!curl_ftp_put('ftp://login:mot_de_passe@serveur/mon_fichier.txt', 'mon_fichier.txt')) {
    die("Le fichier n'a pu être uploadé sur le serveur");
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 11h49   #3
Membre actif
 
Avatar de elcoyotos
 
Inscription : octobre 2006
Messages : 297
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : octobre 2006
Messages : 297
Points : 175
Points : 175
Merci julp pour ta (rapide) réponse.

Toutefois, quelque chose m'échappe.

J'ai deux variables :
  1. La source du fichier à uploader : C:\Documents and Settings\mon_fichier.pdf (peut être n'est-il pas possible d'uploder du client vers le serveur ?)
  2. La destination : ftp://login:mot_de_passe@serveur/mon_fichier.pdf

Voici ton code avec mes variables :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?php
function curl_ftp_put($url, $nom_local, $ascii_mode = FALSE) {  
  // Ta fonction ....
}
 
if (!curl_ftp_put($url, $nom_local)) {  
	die("Le fichier n'a pu être uploadé sur le serveur"); 
}
 
 
$url = 'ftp://login:mot_de_passe@serveur/mon_fichier.pdf';
$nom_local = 'C:\Documents and Settings\mon_fichier.pdf';
 
echo curl_ftp_put($url, $nom_local, $ascii_mode = FALSE );
?>
J'ai invariablement le message : Le fichier n'a pu être uploadé sur le serveur

Il y a donc quelque part quelque chose que je n'ai pas compris.

Peux tu m'indiquer mon erreur ?
elcoyotos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 12h08   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Votre fichier est uploadé ou non ? Et comme ceci est-ce mieux :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
<?php
function curl_ftp_put($url, $nom_local, $ascii_mode = FALSE) {  
  // Ta fonction ....
}
 
$url = 'ftp://login:mot_de_passe@serveur/mon_fichier.pdf';
$nom_local = 'C:\Documents and Settings\mon_fichier.pdf';
if (!curl_ftp_put($url, $nom_local)) {  
	die("Le fichier n'a pu être uploadé sur le serveur"); 
}
?>
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 12h44   #5
Membre actif
 
Avatar de elcoyotos
 
Inscription : octobre 2006
Messages : 297
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : octobre 2006
Messages : 297
Points : 175
Points : 175
Le fichier n'est pas uploader.

Et le code que tu m'as envoyé ni change rien
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php
function curl_ftp_put($url, $nom_local, $ascii_mode = FALSE) {  
  // Ta fonction ....
}
 
$url = 'ftp://login:mot_de_passe@serveur/mon_fichier.pdf';
$nom_local = 'C:\Documents and Settings\mon_fichier.pdf';
 
if (!curl_ftp_put($url, $nom_local)) {  
	die("Le fichier n'a pu être uploadé sur le serveur"); 
}
?>
En fait, tu as juste mis les variables avant la condition .....

Petite précision, entre les variable et la condition, j'ai cette ligne :
Code :
1
2
 
echo curl_ftp_put($url, $nom_local, $ascii_mode = FALSE );
Ce qui donne (désolé pour la répétition du code mais c'est très clair comme ça) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
<?php
function curl_ftp_put($url, $nom_local, $ascii_mode = FALSE) {  
 
	$ret = FALSE;   
 
	if (is_file($nom_local)) {  
		$fp = fopen($nom_local, 'r'); 
		$ch = curl_init($url); 
		curl_setopt($ch, CURLOPT_INFILE, $fp); 
		curl_setopt($ch, CURLOPT_INFILESIZE, filesize($nom_local)); 
		curl_setopt($ch, CURLOPT_UPLOAD, TRUE); 
 
			if ($ascii_mode) {  
				curl_setopt($ch, CURLOPT_TRANSFERTEXT, TRUE); } 
				$ret = curl_exec($ch); curl_close($ch); fclose($fp); 
			}  
 
	return $ret; 
}
 
$url = 'ftp://login:mot_de_passe@serveur/mon_fichier.pdf';
$nom_local = 'C:\Documents and Settings\mon_fichier.pdf';
 
echo curl_ftp_put($url, $nom_local, $ascii_mode = FALSE );
 
 
if (!curl_ftp_put($url, $nom_local)) {  
	die("Le fichier n'a pu être uploadé sur le serveur"); 
}
?>
  1. J'ai testé l'url ftp dans mon navigateur et je me connecte bien à mon serveur FTP.
  2. Bien sûr, mon ficher source est bien à cet emplacement :C:\Documents and Settings\mon_fichier.pdf

Résultat : Le fichier n'est pas uploader et j'ai le message d'erreur.
elcoyotos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 13h58   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
J'ai fait mes tests sur un compte Free mais sur de petits fichiers texte.

Pourriez-vous ajouter :
avant l'appel à curl_close. Que dit-il ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 14h41   #7
Membre actif
 
Avatar de elcoyotos
 
Inscription : octobre 2006
Messages : 297
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : octobre 2006
Messages : 297
Points : 175
Points : 175
J'ai un message d'erreur si j'ajoute : echo curl_error($ch);

J'ai donc, simplifier votre script :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?php
$fp = fopen('C:\mon_fichier.pdf', 'r'); 
$ch = curl_init('ftp://login:mot_de_passe@serveur/mon_fichier.pdf'); 
curl_setopt($ch, CURLOPT_INFILE, $fp); 
curl_setopt($ch, CURLOPT_INFILESIZE, filesize('C:\mon_fichier.pdf')); 
curl_setopt($ch, CURLOPT_UPLOAD, TRUE); 
 
if ($ascii_mode) {  
	curl_setopt($ch, CURLOPT_TRANSFERTEXT, TRUE); 
} 
 
$ret = curl_exec($ch); curl_error($ch); curl_close($ch); fclose($fp); 
 
echo ($ret);	  
?>
Voici le résultat :
Citation:
Warning: fopen() [function.fopen]: Unable to access C:\mon_fichier.pdf in upload.php on line 3

Warning: fopen(C:\mon_fichier.pdf) [function.fopen]: failed to open stream: No such file or directory in upload.php on line 3

Warning: curl_setopt(): supplied argument is not a valid File-Handle resource in upload.php on line 5

Warning: filesize() [function.filesize]: Stat failed for C:\mon_fichier.pdf (errno=2 - No such file or directory) in upload.php on line 6

Warning: fclose(): supplied argument is not a valid stream resource in upload.php on line 13
J'ai juste changé l'emplacement du fichier à uploader (avant C:\Documents and Settings\mon_fichier.pdf après C:\mon_fichier.pdf) car j'ai pensé que CURL pouvait avoir du mal avec les espaces.

Ce qui est interressant par contre c'est qu'on voit que la commande fopen n'accède pas à mon fichier ....

Merci de me consacrer du temps et de la matière grise
elcoyotos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 15h41   #8
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par elcoyotos
J'ai juste changé l'emplacement du fichier à uploader (avant C:\Documents and Settings\mon_fichier.pdf après C:\mon_fichier.pdf) car j'ai pensé que CURL pouvait avoir du mal avec les espaces.
Hum oui s'il ne trouve pas le fichier pour commencer, la suite est problématique d'où mon test initial avec is_file. Que vous dire à part vérifier le nom/chemin ou s'orienter vers un chemin relatif
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 16h41   #9
Membre actif
 
Avatar de elcoyotos
 
Inscription : octobre 2006
Messages : 297
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : octobre 2006
Messages : 297
Points : 175
Points : 175
Mais justement, tout le problème est là.....

Le fichier n'est pas trouvé alors qu'il est là :



J'ai virer le is_file parce que le but c'est de compremdre ce qui se passe avec CURL.

Je suis désolé mais qu'il y est le is_file ou pas ne change rien au script CURL. Non ?

Que voulez vous dire concrètement quand vous parlez de chemin relatif ???
elcoyotos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 20h15   #10
Membre actif
 
Avatar de elcoyotos
 
Inscription : octobre 2006
Messages : 297
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : octobre 2006
Messages : 297
Points : 175
Points : 175
Par défaut Merci

Je voulais vous remercier pour toute votre aides

J'ai envoyé un email à mon hébergeur (online) pour connaitre la marche à suivre.

Si il me répond, je vous tiendrai au courant.

Encore mille mercis du temps que vous avez bien voulu me consacrer.
elcoyotos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 14h15   #11
Membre confirmé
 
Avatar de bigquick
 
Inscription : août 2002
Messages : 356
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 356
Points : 274
Points : 274
Bonjour !

Je me joins à cette discussion pour savoir ce qu'il en est
J'ai exactement le même besoin (upload FTP avev CURL chez Online.net), et je voudrais savoir si tu as eu une réponse de leur part. Et si ça a fini par fonctionner, est-ce que tu connais la taille limite que l'on peut uploader par cette méthode ?

Je ne sais pas si un upload FTP par CURL est limité par les contraintes de leur php.ini :

Code :
1
2
3
max_execution_time	18
max_input_time		20
memory_limit		16M
Merci d'avance pour le petit update si tu as des nouvelles fraiches =)
__________________
And still we will be here, standing like statues ...
bigquick est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 16h42   #12
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par bigquick
Je ne sais pas si un upload FTP par CURL est limité par les contraintes de leur php.ini :

Code X :
1
2
3
max_execution_time	18
max_input_time		20
memory_limit		16M
Bien sûr que si : ça reste un script PHP, cURL (l'extension pas la commande) ou pas, donc soumis aux mêmes paramètres de configuration (temps d'exécution, mémoire maximale allouable, ...).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2007, 15h11   #13
Invité régulier
 
Inscription : avril 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 9
Points : 9
Points : 9
J'ai aussi besoin d'uploader des fichiers sur un compte ftp online.net et je n'y arrive pas avec l'extension curl...
NEOAKIRA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 15h18   #14
Invité régulier
 
Inscription : avril 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 9
Points : 9
Points : 9
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
<?php
$filename = 'test.txt';
$fp = fopen($filename, "r");
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'ftp://privftp.online.net/www/newfile.txt');
curl_setopt($ch, CURLOPT_USERPWD, "user:password");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1); 
curl_setopt($ch, CURLOPT_INFILE, $fp); 
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));
 
$output = curl_exec($ch);
curl_close($ch);
 
print $output;
 
?>
Avec ce script là, j'ai réussi à copier le fichier source 'test.txt' qui se trouve dans le même répertoire que ce script dans un autre répertoire du ftp tout en le renommant 'newfile.txt'...

Maintenant je n'arrive toujours pas et uploader un fichier venant de mon disque dur, que ce soit en indiquant par exemple : 'c:\test.txt' ou en passant par un formulaire html tout simple (ceci représentant le but final de mon script...)
NEOAKIRA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 15h41   #15
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Vous n'essayez tout de même pas d'exécuter un script situé chez votre hébergeur afin d'uploader un fichier situé quant à lui sur votre disque dur ? Auquel cas ça ne pourra jamais fonctionner ainsi : le client n'envoie pas de données comme ça !!!
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h11   #16
Invité régulier
 
Inscription : avril 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 9
Points : 9
Points : 9
Non, moi je veux uploader des fichier a partir d'un formulaire, et je veins de réussir :

le code du formulaire :

Code :
1
2
3
4
5
6
 
<form method="post" enctype="multipart/form-data" action="upload.php">
	<p>
		<input type="file" name="fichier" size="30"  /><input type="submit" name="upload" value="Uploader" />
	</p>
</form>

et le code du fichier upload.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<?php
$filename = $_FILES['fichier']['tmp_name'];
$fp = fopen($filename, "r");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'ftp://privftp.online.net/www/'.$_FILES['fichier']['name']);
curl_setopt($ch, CURLOPT_USERPWD, "user:password");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PUT, 1); 
curl_setopt($ch, CURLOPT_UPLOAD, 1); 
curl_setopt($ch, CURLOPT_INFILE, $fp); 
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));
$output = curl_exec($ch);
curl_close($ch);
?>
voila chez moi ça marche, par contre c'est tout simple simple, basic
et ça doit pas fonctionner pour des gros fichiers et on ne voit pas l'avancement... Donc c'est à améliorer !

EDIT:
Voila ce que j'obtient quand j'essaie d'uploader un fichier de plus d'1Mo :
Citation:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@online.net and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
Il faut absoluement que je puisse uploader des pdf d'environ 10Mo sinon mon boulot tombe à l'eau et ça va pas etre cool...

EDIT 2:
erf dans le phpinfo http://www.achatsenconfiance.com/votrecave/phpinfo.php
je vois que set_time_limit fait partie des fonctions désactivées...
NEOAKIRA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 17h30   #17
Membre confirmé
 
Avatar de bigquick
 
Inscription : août 2002
Messages : 356
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 356
Points : 274
Points : 274
Citation:
Envoyé par julp
Vous n'essayez tout de même pas d'exécuter un script situé chez votre hébergeur afin d'uploader un fichier situé quant à lui sur votre disque dur ? Auquel cas ça ne pourra jamais fonctionner ainsi : le client n'envoie pas de données comme ça !!!
Aie je n'avais pas pensé à ça.... J'avais pourtant lu que CURL était une alternative à l'upload via un formulaire, pour les hebergeurs ou celui-ci était limité. Mais c'est vrai qu'en y repensant, je ne vois pas comment le client pourrait envoyer les données ...

Du coup, si j'ai bien compris, le transfert FTP ne peut fonctionner que si le script est executé sur le poste ou se situe le fichier à envoyer ? S'il faut déployer un serveur web chez chaque client, ça va être problématique

Citation:
Envoyé par NEOAKIRA
Il faut absoluement que je puisse uploader des pdf d'environ 10Mo sinon mon boulot tombe à l'eau et ça va pas etre cool...
Idem, et j'irai même jusqu'à dire que 100 Mo ça serait le top.
Utopique ?
__________________
And still we will be here, standing like statues ...
bigquick est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 18h04   #18
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
@NEOAKIRA : dans le cas de l'upload du client au serveur web (par formulaire donc) vous êtes soumis aux restrictions de PHP en matière de temps d'exécution (max_execution_time) et en taille des données POST (upload_max_filesize et peut être post_max_size). Bien évidemment si vous avez la main sur le serveur (dédié) vous pouvez modifier à votre guise ces paramètres. Il ne faut pas oublier qu'ici, si j'ai bien compris, il faut multiplier tout par deux (ressources, temps) puisqu'il y a deux transferts : client => serveur web => serveur ftp.

@bigquick : le but de cURL tel qu'il vous a été conseillé est de remplacer les fonctions FTP qui sont désactivées sur le serveur online.net (?). Pour ce que vous souhaitez faire, des applets ou des contrôles ActiveX vous permettraient peut être (je ne connais pas ou peu ces technologies) d'arriver à vos fins (il faudra s'adresser aux forums adéquats), étant plus pratique pour vos utilisateurs (surtout pour des néophytes : rien à installer sauf ce petit programme et encore c'est géré par le navigateur si je ne m'abuse) vous n'utiliserez ainsi plus la méthode HTTP mais autre chose (certainement FTP).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 18h30   #19
Membre confirmé
 
Avatar de bigquick
 
Inscription : août 2002
Messages : 356
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 356
Points : 274
Points : 274
Merci beaucoup pour ces explications. Je veux effectivement faire un upload simple, et je pense avoir mal compris, tout comme elcoyotos :
Citation:
Un de mes clients à besoin d'uploader des fichiers par le bias de son BACKOFFICE. Mon client est chez l'hébergeur ONLINE. Ce dernier limite l'upload à 2 méga maxi (et encore ça passe une fois sur 5). La bibliothèque FTP est désactivée. A force de chercher, j'ai fini par trouver sur la FAQ d'ONLINE que pour l'upload, il fallait utiliser le module CURL.
Je vais voir ce que l'on peut trouver du coté Java/ActiveX, mais j'avoue être un peu réticent à utiliser ces technologies

NEOAKIRA : D'après ce que j'ai pu lire sur plusieurs forums, impossible d'uploader (via formulaire) des fichiers de plus d'1 ou 2 Mo chez Online. Pour les 10 Mo, il va falloir se rabattre sur autre chose.

Enfin merci encore julp pour nous avoir consacré un peu de votre temps !
__________________
And still we will be here, standing like statues ...
bigquick est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h16.


 
 
 
 
Partenaires

Hébergement Web