Bonjour,

Bonjour,

Voilà j'ai un soucis depuis une bonne grosse semaine.. enfin, depuis 1an, mais j'ai trouvé ce qui me gênait ^^.
Maintenant que j'ai réussi à me connecter à mon serveur privé, je n'arrive pas à y envoyer une image.
Je ne vous ferais pas l'historique de tout ce que j'ai essayé, mais voilà où j'en suis (je suis en local):

connectionftp.php:

    <?php
if ( isset($_FILES['uploadedfile']) ) {
    $filename  = realpath($_FILES['uploadedfile']['tmp_name']);
    $POST_DATA = array(
        'file' => new CURLFile($filename,'image/jpeg',$_FILES['uploadedfile']['name'])
  );

$ftp_server="ftp://********//mnt/Multimedias/Photo/essaieFpt/"; 
$ftp_user_name="j*****";
$ftp_user_pass="******";

$stderr = fopen("curl.txt", "w"); //for error msg logging
$timeout='30';

$ch = curl_init($ftp_server);

    //pour le chemin/connexion au serveur freenas

curl_setopt($ch, CURLOPT_PORT, 33000);
curl_setopt($ch, CURLOPT_USERPWD, "$ftp_user_name:$ftp_user_pass");

    // quoi faire avec le chemin

curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//curl_setopt($ch, CURLOPT_FTPPORT, "-");
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $POST_DATA);
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

    //SSL connexion
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //Pour ne pas vérifier le certificat, va avec ligne du dessous !!! DANGEREUX !<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);  //Pour ne pas vérifier le certificat. !!! DANGEREUX !
//curl_setopt($ch, CURLOPT_CAPATH, "/certificat.txt");
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);//tente d'utiliser SSL ou à défaut le protocole normal
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);//tente d'utiliser TLS avant SSL

    //pour voir les erreurs

curl_setopt($ch, CURLOPT_VERBOSE, TRUE);//pour le débogage et la compréhension de libcurl et / ou de protocole
curl_setopt($ch, CURLOPT_STDERR, $stderr);//Indiquez à libcurl d'utiliser $stderr plutôt que stderr lors de l'affichage

    //executer/fermer
$ret = curl_exec ($ch);

$error_no = curl_errno($ch);
$error_msg = curl_error($ch);

curl_close ($ch);
//fclose($fp);
fclose($stderr);
    //afficher les erreurs
echo "FTP RESULT: <BR/>error_no: ".$error_no . "<br/>msg: " . $error_msg;

}
?>

Ma page Index.php

<form enctype="multipart/form-data" method='post' action="connectionftp.php">
  <input name="uploadedfile" type="file" value="Choisis l'image">
  <input type="submit" value="Upload">
</form>

A celà, voici ce que me donne l'echo de FPT RESULT:

FTP RESULT:
error_no: 0
msg: 

Ainsi que curl.txt ( le retour du débogage)

* Expire in 0 ms for 6 (transfer 0x253237fa370)
* Expire in 30000 ms for 8 (transfer 0x253237fa370)
* Expire in 30000 ms for 2 (transfer 0x253237fa370)
*   Trying 192.168.0.5...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x253237fa370)
* Connected to ***.***.*.* () port ***** (#0)
< 220 ProFTPD 1.3.5 Server (ServeurFreenas.local FTP Server) [::ffff:***.***.*.*]
> AUTH TLS
< 234 AUTH TLS successful
* SSL connection using TLSv1.0 / DHE-RSA-AES***-SHA

* Server certificate:
*  subject: C=FR; ST=**********; L=*****; O=Privé; CN=**; emailAddress=***************
*  start date: Feb 27 12:16:37 2016 GMT
*  expire date: Feb 24 12:16:37 2026 GMT

*  issuer: C=FR; ST=********; L=********; O=Privé; CN=**; emailAddress=**********
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
> USER ********
< 331 Password required for ********
> PASS ***********
< 230-******

< 230 User ****** logged in
> PBSZ 0
< 200 PBSZ 0 successful
> PROT P
< 200 Protection set to Private
> PWD
< 257 "/mnt/Multimedias" is the current directory
* Entry path is '/mnt/Multimedias'
> CWD /
* ftp_perform ends with SECONDARY: 0
< 250 CWD command successful
> CWD mnt
< 250 CWD command successful
> CWD Multimedias
< 250 CWD command successful
> CWD Photo
< 250 CWD command successful
> CWD essaieFpt
< 250 CWD command successful
> EPSV
* Connect data stream passively
< 229 Entering Extended Passive Mode (|||50078|)
*   Trying ***.***.**.**...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x253237fa370)
* Connecting to ***.***.*.* (***.***.*.*) port 50078
* Connected to ***.***.*.* (***.***.*.*) port ****** (#0)
> TYPE A
< 200 Type set to A
> LIST
< 150 Opening ASCII mode data connection for file list
* Maxdownload = -1
* Doing the SSL/TLS handshake on the data stream
* SSL re-using session ID
* SSL connection using TLSv1.0 / DHE-RSA-AES***-SHA
* Server certificate:
*  subject: C=FR; ST=*****; L=*****; O=Privé; CN=**; emailAddress=****
*  start date: Feb 27 12:16:37 2016 GMT
*  expire date: Feb 24 12:16:37 2026 GMT
*  issuer: C=FR; ST=*****; L=****; O=Privé; CN=**; emailAddress=**********
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
* Remembering we are in dir "/mnt/Multimedias/Photo/essaieFpt/"
< 226 Transfer complete
* Connection #0 to host ***.***.*.* left intact

En gros, je choisi un fichier, je valide, cUrl me dit que c'est bon, et au final, il n'y a pas d'image d'enregistrée quand je vais dans le dossier du serveur.
C'est pas un soucis d'autorisation, le ficher et en 777 et, de plus, mon login est autorisé sur tout. Mon plus gros problème est que je ne comprends pas pourquoi ça ne fonctionne pas....

2 réponses


JoHuv
Auteur
Réponse acceptée

Bon, j'ai une solution fonctionnelle. Problème résolu.
Je le poste ici si ça peut aider à l'avenir...

<?php
if ( isset($_FILES['uploadedfile']) ) {

    $filename  = $_FILES['uploadedfile']['tmp_name'];
    $name_file = $_FILES['uploadedfile']['name'];
    $type_file = $_FILES['uploadedfile']['type'];
    $headers = array("Content-Type:multipart/form-data");

//On vérifie si le type de fichier attendu est correct
    if( !strstr($type_file,'jpg') && !strstr($type_file,'jpeg') && !strstr($type_file,'bmp') && !strstr($type_file,'gif')){
        exit("Le fichier n'est pas une image");
    }

//On s'assure de l'absence de caractères null
    if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file)){
        exit("Nom de fichier non valide");
    }

// On envoie le fichier en copie serveur

$ftp_server="ftp://XXX.XXX.X.X//mnt/Multimedias/Photo/essaieFpt/".$name_file;  // création  du fichier avec son emplacement sur le serveur
$ftp_user_name="lelogin";
$ftp_user_pass="lemotdepasse";

$stderr = fopen("curl.txt", "w"); // pour afficher les erreurs
$fh = fopen($filename, "r"); // pour ouvrir le fichier en copie
$timeout='30';

$ch = curl_init($ftp_server);

    //pour le chemin/connexion au serveur freenas

curl_setopt($ch, CURLOPT_PORT, XXXXX);
curl_setopt($ch, CURLOPT_USERPWD, "$ftp_user_name:$ftp_user_pass");

    // quoi faire avec le chemin

curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_PUT, 1);
curl_setopt($ch, CURLOPT_INFILE, $fh);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);

    //SSL connexion
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //Pour ne pas vérifier le certificat. !!! DANGEREUX ! 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);  //Pour ne pas vérifier le certificat. !!! DANGEREUX !
//curl_setopt($ch, CURLOPT_CAPATH, "/certificat.txt"); // enregistrement du certificat qui annulera les deux lignes du dessus
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);//tente d'utiliser SSL ou à défaut le protocole normal
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);//tente d'utiliser TLS avant SSL 

    //pour voir les erreurs

curl_setopt($ch, CURLOPT_VERBOSE, TRUE);//pour le débogage et la compréhension de libcurl et / ou de protocole
curl_setopt($ch, CURLOPT_STDERR, $stderr);//Indiquez à libcurl d'utiliser $stderr plutôt que stderr lors de l'affichage

    //executer/fermer

$ret = curl_exec ($ch);

$error_no = curl_errno($ch);
$error_msg = curl_error($ch);

curl_close ($ch);
fclose($fh);
fclose($stderr);

    //afficher les erreurs
//echo "FTP RESULT: <BR/>error_no: ".$error_no . "<br/>msg: " . $error_msg;

    // on redirige vers la page index qui contient le formulaire
header('Location: index.php'); 
}
?>

Voici le formulaire sur index.php

    <form enctype="multipart/form-data" method='post' action="connectionftp.php">
    <input name="uploadedfile" type="file" value="choose">
    <input type="submit" value="Upload">
    </form>
JoHuv
Auteur

N'y aurait-il pas quelqu'un qui est à l'aise avec cUrl ?