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

Langage PHP Discussion :

[Upload] Envoi d'un fichier vers un script PHP depuis l'extérieur...


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut [Upload] Envoi d'un fichier vers un script PHP depuis l'extérieur...
    Bonjour,

    Je vous explique succintement mon problème. Je doit envoyer des informations vers une base de donnée MySQL hébergé par un serveur free depuis des clients répartis dans toute la france. Pour des raisons de sécurité, free bloque l'accès de ses bases depuis l'extérieur. La seule solution pour y envoyer des informations est de passer par un script PHP.

    Or, compte tenu de la quantité d'information à envoyer, je suis obligé de passer par un fichier structuré XML. Problème; comment l'envoyer à mon script PHP. J'ai trouvé divers modules ( Python ) permettant d'encoder des variables pour les envoyer à un script PHP, mais aucun pour encoder des fichiers.

    D'où ma question: comment expédier des fichiers vers un script PHP, sans passer par un formulaire HTML ( envoi direct ) ?

    J'ai à ma disposition des sockets que je sais à peu près utiliser... Quelqu'un peut m'indiquer comment faire ?

    Merci beaucoup

    cyrille

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    pas besoin d'envoyer un fichier...

    une socket qui envoie une requête http avec ton flux xml dans l'entête en mode "POST",
    et le tour est joué
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Pouvez vous m'expliquer plus en détail ? Je connais mal le système de requête...

    Concrètement: ( si j'ai bien compris )
    - je créé mon socket;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = socket.scoket(socket.AF_INET, socket.SOCK_STREAM )
    - je me connecte;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     s.connect(('uraniemc.free.fr', 80))
    - j'envoi une requête;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s.send('POST /dev/relyc/php/mon_script.php  -- et après je ne sais pas---')
    Pouvez vous s'il vous plait me dire si j'utilise la bonne procédure et quelle forme doit avoir la requête à envoyer ? Comment ensuite récupérer le flux dans PHP ?

    Merci beaucoup

    Cyrille

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Euh... il n'y a pas de rapport avec php là. Tu as un problème avec ton client écrit en python, donc demande comment utiliser les sockets à des gens qui connaissent python.
    Sinon si tu écrit ton client en php, tu auras plus de chance d'avoir une réponse ici

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Mr N.
    Euh... il n'y a pas de rapport avec php là.
    Oui et non. En fait, ce que je voudrais savoir, c'est comment former la requête http et comment récupérer le fichier dans le PHP. Pour le Python, je m'en charge...

  6. #6
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Bon, ben moi qui n'est jamais fait de Python, c'est assez simple en fait :

    Voici mon code php assez simple, il fait juste un echo de ce qu'il recoit =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    	header('Content-type: text/plain');
    	var_dump($_REQUEST);
    ?>
    Ce script est accessible grace à l'url http://localhost/test_python/

    Voici le code (tiré de la doc) pour l'attaquer =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import httplib, urllib
    params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
    headers = {"Content-type": "application/x-www-form-urlencoded",
               "Accept": "text/plain"}
    conn = httplib.HTTPConnection("localhost")
    conn.request("POST", "/test_python/", params, headers)
    response = conn.getresponse()
    print response.status, response.reason
    print response.read()
    response.close()
    Et voici ce qu'on obtient =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    C:\Python24>python test_python.py
    200 OK
    array(3) {
      ["eggs"]=>
      string(1) "2"
      ["bacon"]=>
      string(1) "0"
      ["spam"]=>
      string(1) "1"
    }
    Il ne te reste plus qu'a l'adapter à tes besoins

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup d'avoir regardé la documentation pour moi, mais je l'avais déja fait. J'ai en effet regardé ce script, mais ne correspond pas à nos besoins...

    Je vais vous expliquer pourquoi. En effet, il nous faut envoyer non pas une dixaine de variables mais des centaines, voire des milliers. J'avais déjà fait le test avec cette méthode, mais elle mettait environ 40 ms pour l'envoi de deux variables ! Sachant que nous avons une information à enregistrer toute les 10 ms, ce n'est même pas envisageable.

    En effet, la seule solution que j'ai trouvé, c'est de structurer les données en XML et de l'envoyer au serveur toute les heures. Et c'est là tout notre problème. En y réfléchissant, je me suis dit que pour envoyer un fichier, la seule solution était d'arriver à faire une requête similaire à celle que fait un formulaire de ce type et de l'envoyer par un socket.
    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
     
    <HTML>
    <HEAD>
        <TITLE> Upload de fichiers </TITLE>
    </HEAD>
     
    <BODY>
        <FORM ENCTYPE='multipart/form-data' ACTION='upload.php' METHOD='post'>
            <INPUT TYPE='hidden' NAME='MAX_FILE_SIZE' VALUE='1000000'>
            Uploader ce fichier sur le serveur:
            <INPUT NAME='fichier' TYPE='file'>
            <INPUT TYPE='submit' VALUE='Envoyer'>
        </FORM>
    </BODY>
     
    </HTML>
    Le problème, c'est que, le HTML et le PHP sont tous les deux sur le serveur. Donc impossible de sniffer la communication !

    Et c'est là que gorgonite nous suggère non pas d'envoyer un fichier, mais de créer un flux. C'est à vrai dire une très bonne idée. Seul problème, nous ne savons pas comment faire ! Je me suis renseigné sur le RSS, mais je n'ai rien trouvé d'interressant.

    Ma question est donc quelle est la requête qui permet d'établir un flux XML entre mon fichier sur mon ordi et un script PHP sur le serveur ? Comment ensuite récupérer ce flux dans PHP ?

    Merci beaucoup

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Et bien regarde l'exemple que je t'ai donné, je modifie juste les params et c'est fini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import httplib, urllib
    
    xml = '<p>Ceci est un flux <b>xml</b> !</p>';
    params = urllib.urlencode({'xml': xml})
    
    headers = {"Content-type": "application/x-www-form-urlencoded",
               "Accept": "text/plain"}
    conn = httplib.HTTPConnection("localhost")
    conn.request("POST", "/test_python/", params, headers)
    response = conn.getresponse()
    print response.status, response.reason
    print response.read()
    response.close()
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C:\Python24>python test_python.py
    200 OK
    array(1) {
      ["xml"]=>
      string(36) "<p>Ceci est un flux <b>xml</b> !</p>"
    }

  9. #9
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Question bête en passant : pourquoi ne pas utiliser un simple formulaire HTML ?
    Avec un seul champ <input type="file">, tu pourras envoyer ton fichier XML à PHP sans aucun souci.
    Non ?

  10. #10
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    J'imagine que c'est parce que ça fait partie d'un traitement automatique. Et je ne vois pas comment remplir simplement et automatiquement le contenu d'un formulaire html...

  11. #11
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Okay, bien vu.

    Sinon, toujours seulement en passant (Mr N. s'en sort admirablement) : parler de "flux RSS" est un abus de langage. La terminologie correcte est "fil RSS".
    RSS ne désigne guère plus qu'une structure particulière de fichier XML... Rien à voir avec les flux de données.

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par cyrpaut
    Pouvez vous, s'il vous plait, regarder à nouveau l'ensemble de la discussion et nous expliquer d'avantage, ou nous indiquer des pistes pour continuer.
    http://www.developpez.net/forums/sho...d.php?t=150762
    déjà quelques questions préléminaires :

    - dans quel langage voulez-vous faire ce petit script ?


    - ensuite, quelle méthode souhaitez-vous utiliser ?
    le fichier xml qu'on envoie...
    en php, je ferais une lecture du fichier, un pack(), puis un bin2hex()

    ensuite on envoie cette donnée par une socket http en post...

    enfin, de l'autre on récupère la donnée, on convertit l'hexadécimal en binaire (une fonction pour faire cela est disponible sur www.php.net dans les commentaires sur bin2hex), et un coup de unpack()

    -------------------------


    en revanche, je pense que php sera trop lent pour faire cela... mieux vaut utiliser python du côté envoi

    côté réception, tout dépend de votre hébergement, etc. mais si c'est du php il faudra penser à initialiser la variable temps pour durée infinie en début de script...


    Voilà, avec plus de détails, on pourra affiner... et s'approcher de la solution concrète.
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup de vous préocuper de mon problème.

    Comme je l'expliquait à gorgonite, il s'agit d'envoyer depuis un programme Python un ensemble de donnée dans un fichier structuré XML vers un script PHP pour qu'il les stocke dans la BDD.
    Le fichier sera un très gros fichier ( des centaines de lignes de XML ).

    J'avais déjà expérimenté l'envoi de variable par cette méthode. Mais je n'avais pas pensé à envoyer le fichier sous forme de chaine de caractère !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xml = '<p>Ceci est un flux <b>xml</b> !</p>';
    params = urllib.urlencode({'xml': xml})
    C'est une très bonne idée. Cependant, j'ai peur que le fait d'envoyer un tel fichier sous forme d'une chaine de caractère pose des problèmes. Néamoins, je vais essayer. Je ne pense pas avoir le temps d'ici Mercredi soir.

    Je vous tiendrai au courant.

    En tout cas, merci beaucoup pour l'intêret que vous portez à mon problème.

    cyrpaut

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Voici une copie du mail privé que j'avais envoyé à gorgonite:

    Merci beaucoup de l'intérêt que vous portez à mon problème.

    Je vais vous expliquer plus en détail mon projet.
    C'est un projet de recherche scientifique. Il s'agit de la détections de rayons cosmiques ( particules extraterrestre qui arrivent dans l'atmosphère terrestre à des énergies faramineuses ( des centaines de fois ce que nous sommes capable de produire sur terre )). En entrant dans l'atmosphère, ces particules se désintègrent en une gerbe de sous particules. C'est le résultat de cette désintégration que nous détectons avec nos détecteur. Plusieurs de ces détecteurs sont actuellement en construction. Il seront, à terme, répartis dans tout le bassin parisien.

    Le but de mon projet est de collecter toutes les mesures de ces différents détecteurs dans une base de donnée commune, afin de pouvoir analyser leurs résultats. Cette base est hébergée par un serveur free.

    Les bases de données free ne sont pas accéssible depuis l'extérieur. Pour y transférer les données, il est nécéssaire de transiter par un script PHP.

    Le logiciel pilotant le détecteur sera écrit en Python (il est en cour de conception). Celui-ci rassemblera les mesures dans un fichier XML. Il y a plusieurs mesures par secondes ( caractérisé par 5 variables ), il est donc impossible les envoyer directement. De plus, s'il y a des ruptures temporaires de connexion...

    Toutes les heures, le logiciel Python devra expédier l'ensemble des mesures stockés dans le XML vers un script PHP, afin qu'il les stocke dans la base de donnée.

    La première solution que nous ayons trouvé était l'envoi des variables une par une. Celle-ci ne s'est pas révélé assez performante. Nous en étions donc à nous demander comment envoyer le fichier XML vers un répertoire du serveur, comme le ferait un formulaire HTML, pour le traiter ensuite avec PHP. ( nous ne voulons pas utiliser le protocole FTP pour des raisons de sécurité )

    Vous nous avez donné une excellente idée en nous parlant de flux XML. A vrai dire, nous n'y avions pas pensé. Le problème est que nous avons aucune idée de comment le gérer, ni en python, ni en PHP. J'ai commencé à me renseigner sur le RSS, mais sans succès.

    La solution de l'envoi en hexa décimal me paraît interressante. Néanmoins, Apache ne dispose-t'il pas de fonctions appropriés pour gérer les transfert d'information au format XML ?

    Voilà notre problème. Vous avez l'air de bien connaitre le domaine. Pouvez vous nous donner des pistes ?

    Je me suis pas mal renseigné sur les sockets. Cet outil m'à l'air très puissant. Le problème, c'est que nous avons aucune idée de la manière de concevoir des requêtes appropriés.

    Encore merci

    Cyrille

  15. #15
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je ne sais pas quel est le format de ton xml, mais je trouve qu'un flux xml est beaucoup trop verbeux et consommateur de bande passante.
    Personnellemnt pour le transfert de données structurées (différent de documents structurés) j'utilise JSON.
    http://www.json.org/

  16. #16
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Je ne sais pas quel est le format de ton xml, mais je trouve qu'un flux xml est beaucoup trop verbeux et consommateur de bande passante.

    Mais on peut compresser avant d'envoyer


    Personnellemnt pour le transfert de données structurées (différent de documents structurés) j'utilise JSON.
    http://www.json.org/


    Y a-t-il au moins déjà des API pour bosser sans avoir à réinventer la roue, du même genre que simplexml ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  17. #17
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Du json compressé sera surement moins lourd que du xml compressé.

    Quand aux librairies, oui il y en a, c'est même en discussion pour une integration au sein de php6

  18. #18
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Du json compressé sera surement moins lourd que du xml compressé.

    Quand aux librairies, oui il y en a, c'est même en discussion pour une integration au sein de php6
    déjà dans php5, ce serait mieux, parce que vu le nombre de personnes qui ne sont pas passés du php4 au php5...
    quoique les utilisateurs de php5 seront sans doute plus aptes à passer à php6, et on aure droit au troll php4 vs php6


    au fait, tu n'as pas mis de liens vers ces librairies...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  19. #19
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Oui, mais si je faisais référence à php6, c'est qu'ils pensent à l'integrer donc ca donne un peu plus de légitimité à ce format... D'autant plus pertinent avec la mode ajax

    Pas mis de liens vers ces librairies ? si si =>
    http://www.json.org
    (regarde à la fin, je ne peux faire mieux )

  20. #20
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Pas mis de liens vers ces librairies ? si si =>
    http://www.json.org
    (regarde à la fin, je ne peux faire mieux )
    désolé...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

Discussions similaires

  1. Réponses: 14
    Dernier message: 14/03/2007, 19h32
  2. Réponses: 5
    Dernier message: 21/11/2006, 22h58
  3. Réponses: 6
    Dernier message: 07/11/2006, 11h44
  4. [Upload] Upload de fichier avec un script PHP
    Par largolgd dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2006, 15h21
  5. Envoi de variables/fichiers vers un script PHP
    Par e-king dans le forum Réseau/Web
    Réponses: 9
    Dernier message: 02/04/2006, 19h44

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