IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Envoyer un fichier avec CURL


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut Envoyer un fichier avec CURL
    Bonjour
    Je suis en PHP 7 et je veux envoyer un fichier avec CURL
    J'ai repris des exemples de la doc et ceux du web, mais je ne parviens pas à envoyer le fichier
    Cela semble pourtant simple.

    Voici ce que j'ai codé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    		$uri=$POST_ApiAdresse.'api/now/attachment/upload?table_name=sc_req_item&table_sys_id='.$Id;
     
    		$Chemin='c:/Users/ulmeen/Documents/';
     
    		$Fichier='MonFichier.xml';
     
    		$FichierSource=$Chemin.$Fichier;
     
    		$curl = curl_init($uri);
    		$headers = array(
    			'Accept:application/json',
    			'Content-Type:multipart/form-data',
    			'Authorization: Basic '. $POST_Acces
    		);
    		$cfile = curl_file_create($FichierSource,$Mime,$Fichier);
     
    		$data = array('file' => $cfile);
    		echo '<br/>datas à transférer<br/>';
    		print_r($data);
    		echo '<br/>';
     
    		curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
     
    		curl_setopt($curl, CURLOPT_POST, 1);
    		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
     
    		echo '<br/>transfert fichier ...';
     
    		$result_retour = curl_exec($curl);
     
    		if(strpos($result_retour,'failure') >0 || curl_errno($curl) >0){
    			echo '......pas de transfert';
    			echo '<br/>Erreur Curl='.curl_errno($curl);
    			echo '<br/>retour Curl:'.$result_retour;
    		}
    		else{
    			echo '......Fichier transféré';
    		}
    J'obtiens :
    datas à transférer
    Array ( [file] => CURLFile Object ( [name] => c:/Users/ulmeen/Documents/MonFichier.xml [mime] => xml [postname] => MonFichier.xml ) )

    transfert fichier .........pas de transfert
    Erreur Curl=26 ce qui correspond à "There was a problem reading a local file or an error returned by the read callback."
    Avez-vous une idée pour m'aider ?

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    il vous manque curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); pour récupérer le résultat dans la variable.

    si vous commentez la ligne avec "CURLOPT_POSTFIELDS", est ce que la requete est bien envoyée ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut suite
    J'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    Mais cela n'a rien changé.

    Si je commente la ligne du CURLOPT_POSTFIELDS, il n'y a plus d'erreur (mais évidemment plus de tentative de transfert de fichier)

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    essayez en changeant les "/" par "\\" dans le chemin du fichier.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut
    j'ai réactivé la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    J'ai remplacé les slashs par des anti-slashs dans le chemin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Chemin='c:\\Users\\ulmeen\\Documents\\';
    Ce n'est pas mieux :

    datas à transférer
    Array ( [file] => CURLFile Object ( [name] => c:\Users\ulmeen\Documents\MonFichier.xml [mime] => xml [postname] => MonFichier.xml ) )

    transfert fichier .........pas de transfert
    Erreur Curl=26
    retour Curl:

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    je commence à être à cours d'idées.
    essayez en mettant le fichier à uploader dans le même répertoire que le fichier php et pour le chemin mettez $Chemin = __DIR__ . DIRECTORY_SEPARATOR;.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut suite
    J'ai modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Chemin = __DIR__ . DIRECTORY_SEPARATOR;
    On n'obtient toujours un transfert, mais on provoque une information d'erreur en sus

    Array ( [uploadFile] => CURLFile Object ( [name] => /applis/www/www-ipsac-dev.intra.cea.fr/staging/www/html/modules/influx/MonFichier.xml [mime] => xml [postname] => MonFichier.xml ) )

    transfert fichier .........pas de transfert
    Erreur Curl=0
    retour Curl:{"error":{"detail":null,"message":"Missing parameter: table_name"},"status":"failure"}

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    pour revenir au problème du fichier, vous essayiez de lire un fichier qui n'était pas sur le même système ? php s'exécute sur le serveur donc il a seulement accès aux fichiers qui sont sur le serveur.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut info du fichier à transférer
    De base, j'ai prévu que le fichier X situé sur le partage auquel accède mon serveur Web (lecteur du serveur déporté sur un serveur de fichiers) soit déposé via une API sur une autre plateforme.
    Mais comme cela ne fonctionne pas, j'ai tenté le transfert d'un fichier situé son mon ordi.
    Et enfin, comme vous le suggériez, j'ai tenté le transfert d'un fichier situé sur le serveur web même dans le répertoire de mes pages php..

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut suite
    Bilan, je n'ai toujours pas de solution

  11. #11
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    et vous n'avez rien essayé d'autre depuis le 30 septembre ?

    et je vois que dans le message de 18 h 01, vous n'expliquez pas le résultat de vos tests.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut tests réalisés
    Tests réalisés :

    Test 1 - Chemin relatif
    $FichierSource=/media/xxxxxxxxxxxxxx/Dev/INFLUX/ACCESRESS/Attente/MonFichier.xml

    datas à transférer
    Array ( [uploadFile] => CURLFile Object ( [name] => /media/xxxxxxxxxxxxxxx/Dev/INFLUX/ACCESRESS/Attente/MonFichier.xml [mime] => xml [postname] => MonFichier.xml ) )

    transfert fichier .........pas de transfert
    Erreur Curl=0
    retour Curl:{"error":{"message":"Missing parameter: table_name","detail":null},"status":"failure"}


    Test 2 - Chemin absolu sur mo poste
    $FichierSource=c:/Users/xxxxxxx/Documents/MonFichier.xml

    datas à transférer
    Array ( [uploadFile] => CURLFile Object ( [name] => c:/Users/xxxxxxxx/Documents/MonFichier.xml [mime] => xml [postname] => MonFichier.xml ) )

    transfert fichier .........pas de transfert
    Erreur Curl=26
    retour Curl:

    Test 3 - Chemin absolu sur le filer (le site a ses ses sources sur le serveur web)
    $FichierSource=\\serveur de fichier\xxxxxxxxxxx\Dev\INFLUX\ACCESRESS\Attente\MonFichier.xml

    datas à transférer
    Array ( [uploadFile] => CURLFile Object ( [name] => \\serveur de fichier\xxxxxxxxxxx\Dev\INFLUX\ACCESRESS\Attente\MonFichier.xml [mime] => xml [postname] => MonFichier.xml ) )

    transfert fichier .........pas de transfert
    Erreur Curl=26
    retour Curl:

  13. #13
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    l'erreur 26 indique que php n'arrive pas à accéder au fichier.
    pour utiliser le partage de fichier vous devez peut-être voir du côté des autorisation du partage pour autoriser le serveur http.

    et pour l'erreur 0, cela indique que la requête http a bien été envoyée.
    si vous avez une erreur, elle vient de l'api donc il faut vous renseigner au sujet des paramètres demandés par l'api.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut solution trouvée
    Voici finalement la solution trouvée; j'y étais quasiment.
    Le document transféré est, comme prévu, sur un partage accessible du serveur web

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    		$uri=$POST_ApiAdresse.'api/now/attachment/upload';
     
    		$curl = curl_init($uri);
    		$headers = array(
    			'Content-Type:multipart/form-data',
    			'Accept:application/json',
    			'Authorization: Basic '. $POST_Acces
    		);
     
    		$cfile = new CURLFile($FichierSource, $Mime, $Fichier);
     
    		$data = array ("table_name" => "sc_req_item", "table_sys_id" => $Id , "uploadFile" =>$cfile);
     
    		curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    		curl_setopt($curl, CURLOPT_POST, 1);
    		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    		//curl_setopt($curl, CURLOPT_VERBOSE, 1); //true pour afficher les informations de façon verbeuse. Écrit la sortie sur STDERR, ou dans le fichier spécifié en utilisant CURLOPT_STDERR.
    		//curl_setopt($curl, CURLOPT_STDERR, fopen('/media/www-ipsac-dev.intra.cea.fr/EFARE_Piece_Jointe/Dev/INFLUX/ACCESRESS/Attente/curl.txt', 'w+')); //curl.txt contiendra les infos en cas d'erreur
    		curl_setopt($curl, CURLOPT_TIMEOUT, 100); // 100s allouées
     
    		$result_retour = curl_exec($curl);
    		if(strpos($result_retour,'failure') >0 || curl_errno($curl) >0){
    			$Message = curl_error($curl);
    			$Detail='Probleme appel de API. Erreur='.curl_errno($curl);
    		}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment envoyer des fichiers avec winsock2 ?
    Par x-programer dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 08/02/2009, 08h29
  2. .NET - envoye d'images avec Curl
    Par opimon dans le forum C#
    Réponses: 2
    Dernier message: 01/02/2008, 09h16
  3. [cURL] Copie de fichier avec Curl
    Par eowene dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 17/11/2006, 15h03
  4. Envoyer un fichier avec Inet
    Par ShortcutZ dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 26/09/2006, 00h15
  5. Serveur/Client UDP: comment envoyer un fichier avec mon code
    Par danje dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 21/12/2005, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo