8791 sujets

Développement web côté serveur, CMS

Pages :
Salut tout le monde,

Je viens sur AlsaCréations pour vous soumettre mon souci actuel concernant un développement web.
Ce dev doit me traiter un fichier XML envoyé par un fournisseur grâce à la méthode POST vers une page que j'ai créé et qui me ré-expédie ce fichier dans un format compatible avec un soft de compta. (Sage en l'occurence).
Mon problème est que ce dev fonctionne parfaitement avec un formulaire, c'est à dire que je prends un fichier XML exemple, fourni par mon fournisseur, et le soumet grâce donc à un formulaire. Jusque là tout va bien.
J'ai discuté avec ces personnes et ils me disent de créer un script "d'écoute", hors je ne vois pas comment traiter ce fichier sans lui associé un nom de variable... Dans mon formulaire le champs 'files' à un identifiant, que j'associe donc à ce fichier. Mais sans formulaire et sans variable je ne vois pas comment faire Smiley bawling

On me dit d'utiliser la méthode XFORM, mais je ne vois pas ce que cela changerai pour moi... A moins que je me trompe et que je n'ai pas compris ce qu'était XFORM...

Je ne sais pas si je me suis clairement expliquer, tout ceci est assez flou à vrai dire pour moi... Toute aide la sera super bien venue.

Please Help ! Smiley confused
il est ou ton problème ???

si tu dit :
a écrit :
Ce dev doit me traiter un fichier XML envoyé par un fournisseur grâce à la méthode POST vers une page que j'ai créé et qui me ré-expédie ce fichier dans un format compatible avec un soft de compta. (Sage en l'occurence).
Mon problème est que ce dev fonctionne parfaitement avec un formulaire, c'est à dire que je prends un fichier XML exemple, fourni par mon fournisseur, et le soumet grâce donc à un formulaire. Jusque là tout va bien.


la je te suis plus si tout va bien , il est ou le problème ??
Salut,
Mon problème est que personne ne va remplir le formulaire, le fichier est envoyé sur cette page sans passer par le formulaire par leur serveur à eux, donc sans nom de variable. Et mon script doit être attentif à se qui se passe, un script "d'écoute" comme ils m'ont dit. C'est dans le titre du sujet.
Je sais pas si c'est plus clair, j'ai un exemple qui m'a été fourni en VB, j'essaierai de le posté un peu plus tard dans la journée.
Merci.
Modifié par benouille68 (11 Jun 2008 - 09:16)
Voilà je mets l'exemple en VB qui m'a été fourni,
Je sais qu'il me manque un include mais c'est tout ce que j'ai a ma disposition.
<% 
@ Language=VBScript
%>
<%
strCatalogue = "xxxxx"
%>
<!-- #Include File ="../include/xxxxxxxx" -->
<%
If Request.totalBytes > 0 Then'
 dim xmldoc
 set xmlDoc = Server.CreateObject("Microsoft.FreeThreadedXMLDOM")
 '**************** Charge la requête XML dans un objet XML ***************************
 xmlDoc.Load Request
        ' ************Code lisant le fichier XML et le stockant dans une base de données ***************** 
  If (xmlDoc.parseError.errorCode <> 0) Then
     Dim myErr
     Set myErr = xmlDoc.parseError
     StrReponse =  myErr.reason
  Else
   StrReponse = xmlDoc.xml
   set oInvoiceType = xmlDoc.selectsinglenode("//Invoice/InvoiceHeader/InvoiceType")
   
   if oInvoiceType.Text="Invoice" then
      set oIMAccountNumber = xmlDoc.selectsinglenode("//Invoice/IMAccountNumber")
      set oCustomerPO = xmlDoc.selectsinglenode("//Invoice/InvoiceHeader/CustomerPO")
      set oInvoiceNumber = xmlDoc.selectsinglenode("//Invoice/InvoiceHeader/InvoiceNumber") 
      set oOriginalOrderNumber = xmlDoc.selectsinglenode("//Invoice/InvoiceHeader/OriginalOrderNumber")
      set oInvoiceDate= xmlDoc.selectsinglenode("//Invoice/InvoiceHeader/InvoiceDate")
      SQL = "INSERT INTO [Statut - tracking] (CustNumber,CustomerPO,InvoiceNumber,OriginalOrderNumber,InvoiceDate)"
      SQL = SQL &" VALUES"
      SQL = SQL &" ("&mid(oIMAccountNumber.Text,5,6)&",'"&oCustomerPO.Text&"','"&oInvoiceNumber.Text&"','"&oOriginalOrderNumber.Text&"','"&oInvoiceDate.Text&"')"
      response.write SQL
      Connexion.Execute(SQL)
   end if
   
  End If
  'SQL = "INSERT INTO [XML - Factures] ([Date],[Contenu],[Heure]) VALUES('" & Date() & "','" & StrReponse & "','" & Time() & "')"
  'Response.status SQL
  'Connexion.Execute(SQL)
  Connexion.Close
  Set Connexion = nothing
 
else
  ' Customer's code  
  Response.status = "<Reponse>Aucune donnée de reçue</Reponse>"  
end if
Response.End
 
'xxxxx vérifie juste le statut 200 (valeur retournée par default) pour déterminer
'si le POST a été réussi ou non. Comme il s'agit de la valeur par défaut, ne mettez pas de valeur, 
'comme Response.status = "200 OK" ou Response.status = "202 Accepté"
 
%>


Je suis un peu perdu ne connaissant rien au VB... Smiley confus
Modifié par benouille68 (11 Jun 2008 - 09:16)
Je ne sais pas si j'ai bien compris ton problème...

Peut-être que tu pourrais procéder de la même manière que pour lire un flux rss, c'est à dire en créant un script qui vas régulièrement lire le fichier xml généré par ton application. Dans ce cas inutile de l'envoyer, c'est le serveur qui doit recevoir l'information qui ira le lire, c'est ce que semble faire ton fichier VB.

Si tu utilises php tu peux faire cela avec les fonctions fopen, fread etc...
Modifié par matmat (11 Jun 2008 - 18:59)
Lol, t'inquiète pas, je me demande par moment si j'ai bien compris mon propre problème tellement c'est obscur...
En fait, le fichier XML, je ne l'ai pas... C'est une fois par nuit à horaire fixe, le serveur de mon fournisseur me l'envoi sur un URL, un page PHP quoi, qui me le mouline et me le réexpédie sous format compatible pour mon appli comptable en tant que pièce jointe par mail. Mon boss n'a plus qu'à l'importer dans le logiciel comptable.

Je sais faire un formulaire avec un champ "FILE", et de cette manière cela fonctionne. Mais là, le champs "FILE" a un "id" que je nomme arbitrairement "champs_fichier", que je récupère sur la page PHP comme un $fichier_a_mouline = $_POST['champs_fichier']; grâce à l'action de mon formulaire.

Mais là, je n'ai pas de formulaire, donc pas moyen d'associer la variable "$fichier_a_mouline" avec mon $_POST['']. Ton idée est bonne, tu prends le problème à l'envers en disant que c'est mon appli à moi qui doit aller chercher ce fichier, hors je n'ai pas d'URL ni quoi que ce soit, si je lis la doc qui m'a été fournie, c'est mon appli à moi qui doit attendre que le fichier arrive.

J'ai soumis mon pb sur d'autres forums, on m'a orienté vers les méthodes XFORM (que je ne pense pas adaptée car c'est en gros une autre manière d'écrire un formulaire que la méthode dite "classique") ou vers XMLHttpRequest, mais là je sèche... Et à force d'y réfléchir j'ai l'impression de me perdre aussi dans mes idées et mes pensées... Smiley confus

Je précise que le fichier que mon fournisseur m'envoie n'a jamais le même nom, sinon j'aurais pu grugé... Lol, même si c'est pas propre du tout.

Merci de ton aide précieuse.
a écrit :
C'est une fois par nuit à horaire fixe, le serveur de mon fournisseur me l'envoi sur un URL, un page PHP quoi, qui me le mouline et me le réexpédie sous format compatible pour mon appli comptable en tant que pièce jointe par mail. Mon boss n'a plus qu'à l'importer dans le logiciel comptable.


Donc le but du jeux c'est que au final le boss reçoive le fichier par mail? Dans ce cas pas la peine de faire un formulaire ni un fopen, il suffit de l'envoyer directement par mail.

C'est a dire :

1. le serveur de ton fournisseur envoie le fichier.
2. ton appli php la reçois, la mouline, et l'envoie par mail au bon format.

Maintenant si c'est toi que te charge de l'envoie du fichier depuis le serveur de ton fournisseur, je te conseil de le faire génerer un fichier xml, ainsi ton appli php peu aller la chercher à n'importe quel moment est elle sera toujours dipo.
Modifié par matmat (12 Jun 2008 - 16:25)
matmat a écrit :

2. ton appli php la reçois, la mouline, et l'envoie par mail au bon format.


Tu as tout compris mais là où je ne parviens pas à développer c'est justement pour le "recevoir" ce fichier... Pour que lorsque le fichier est envoyé sur ma page, elle le détecte et le mouline. La moulinette et tout le reste fonctionne... Mais c'est pour déclencher la moulinette justement que je ne vois pas comment faire.

Ce n'est pas moi qui vais chercher le fichier, c'est leur serveur qui me l'envoie (c'est effectivement un fichier XML).

Merci en tout cas de t'intéresser à mon problème, je dois avouer que sur les autres forums me questions sont restées sans réponses et je commençais un peu à Smiley biggol

++
Modifié par benouille68 (12 Jun 2008 - 18:26)
Il y a encore des trucs que j'ai pas compris,
- a tu accès au serveur de ton fournisseur?
- peux tu installer un script sur ce serveur?
- Le fichier xml que lui t'envoie c'est l'url d'un fichier xml qui est disponible tout le temps ou juste le temps du transfert?
- Si les url sont toujours différentes et que tu n'as pas accès a ce serveur comment peux tu savoir quel est le fichier?
- si tu as accès au serveur du fournisseur, ou que tu peux installer un script dessus pourquoi ne pas envoyer le mail directement depuis celui ci?

Ton appli doit lire le fichier xml, donc il faut que tu regardes du coté des fonctions fopen() (voir doc php) qui permette d'ouvrir des fichier de ce type, ensuite d'autre fonction vont te permettre de l'analyser. Ce que tu peux commencé

Pour que ton fichier soit lu tout les jours a une heure précise il faut regarder du coté des méthodes cron.
Alors dans l'ordre :
- Non je n'ai pas accès à ce serveur (je n'ai aucun droit dessus d'ailleurs)
- Non
- Le temps du transfert (certes cela doit rester sur le serveur sans doute, mais ce n'est envoyé qu'une seule fois par nuit)
- Justement c'est là tout le problème.
- Je n'ai pas accès

Pour le traitement que ce soit fopen etc... ça, cela fonctionne, je parse mon XML sans problème et le réexpédie sans problème non plus.
Je n'ai pas accès aux tâches cron.

D'où, le terme de script "d'écoute"... Ma page doit être attentive à ce que l'on me POST... C'est chaud, super chaud comme truc...

Smiley sweatdrop

Je rectifie, on me parle sur un autre forum de SOAP... Je vais essayer de me renseigner sur ça...
Modifié par benouille68 (12 Jun 2008 - 21:57)
Si c'est en php, sans tâches cron, c'est très chaud. à Moins, d'avoir un ordinateur avec un navigateur ouvert 24h/24 et sur le code de ta page tu fais faire un refresh toute les 24h.

Sinon, pour faire un programme d'écoute en php c'est, pour moi, impossible sans cron, ou ordinateur à dispo 24h/24 (le serveur apache peut très bien faire navigateur open bar Smiley lol )

Une question, comment le fournisseur t'envoie le fichier que tu dois remanier ? Par mail, par téléphone, par courrier ?
Merci super_baloo8 de toi aussi, t'intéresser à mon problème.
Je sais que c'est chaud.

Mon fournisseur me l'envoie par POST HTTP simplement. En fait, c'est comme si la page avec le formulaire c'était lui qu'il l'avait, il me soumet donc le fichier sur la page de l'action de mon formulaire qui le récupère, et le traite. En fait il n'y a aucun navigateur la dedans, c'est une discussion SERVEUR <-> SERVEUR, personne n'intervient.

J'ai pas encore eu le temps de regarder pour la méthode SOAP. Je vais essayer entre midi et 2 aujourd'hui...
De rien Smiley cligne

Ok, donc tu recois quelques chose en POST.

Donc sur ton script, même si tu ne connais pas le nom, tu peux afficher toutes les variables POST (echo print_r($_POST);)

Donc je suis sur que tu as moyen de récupérer le nom du fichier en parcourant le tableau associatif "$_POST". Donc tout le reste devient simple.

Par contre, si tu n'as pas de tâche cron, je ne vois pas comment automatiser ton script. Le script php est quelques chose qui doit être activé. Il ne s'auto execute pas. Les tâches crons permettent de simuler une auto execution (mais en fait c'est comme si un utilisateur venait, et lancé le script).

Quand je parlais du navigateur ouvert, je ne parlais pas qu'une personne le fasse. C'est un navigateur ouvert une fois, sur la page de ton script, et ton script qui une fois terminé demande au navigateur de se rafraichir dans 24 h (à l'aide de la <meta http-equiv="refresh" content="0; ....) Comme ça pas de tâche cron, mais une simulation de tâche cron à l'aide d'un navigateur).
Salut, salut,
Super_baloo8 a écrit :
Par contre, si tu n'as pas de tâche cron, je ne vois pas comment automatiser ton script.
Ben d'après ce que j'en comprends il n'y a rien à automatiser Smiley rolleyes ...

Il suffit de traiter les variables POST quand la page est appelée (formulaire soumis par le fournisseur).

A+
Ben en fait, je pense ne pas avoir besoin de tâches cron, en fait c'est l'action de POST sur ma page php qui va faire qu'apache l'executera (la page PHP), non ?
L'action POST remplace l'action d'un utilisateur lors d'un clic sur un SUBMIT.

Mais je ne sais pas effectivement par contre exactement la méthode pour parcourir mon tableau $_POST. Si j'arrive à faire ça, tout devient très simple effectivement.

Ma difficulté était justement de pouvoir récupérer ça et le stocker, soit dans un tableau, soit une variable. Parce que par habitude je faisais $fichier = $_POST['champs_files_de_la_page_précédente'], mais si tu me dis que je peux récupérer TOUT (une seule chose en vérité puisqu'il n'y aura qu'un seul fichier) ce qui est posté et le mettre dans un tableau, là je pourrais m'en sortir je pense.

Je vais donc me renseigner, sur la syntax de cette méthode.

Au passage j'ai un peu regardé SOAP et franchement je trouve ça bien compliqué juste pour faire ça... J'ai une piste merci.
En fait, je n'ai jamais eu à traiter de gros formulaire, donc à chaque fois, je procédais comme ça :

$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
... et ainsi de suite...

Mais j'imagine un formulaire avec 100 variables postées par exemple, je vais surement pas taper tout ça de cette manière.
Donc effectivement, je pense qu'on doit pouvoir mettre tout ça dans un tableau. Reste à trouver comment.
Heyoan a écrit :
Salut, salut,
Ben d'après ce que j'en comprends il n'y a rien à automatiser Smiley rolleyes ...

Il suffit de traiter les variables POST quand la page est appelée (formulaire soumis par le fournisseur).

A+

Le problème : Je n'ai pas de formulaire dans mon cas... Merci.
benouille68 a écrit :
Le problème : Je n'ai pas de formulaire dans mon cas... Merci.
Le formulaire est soumis par ton fournisseur Smiley cligne !

Pour connaître le nom des variables il suffit de faire ce que proposait Super_baloo8 :
<?php
if (!empty($_FILES)) {
echo '<pre>';
print_r($_FILES);
echo '</pre>';
}
?>
Ah je pensais faire comme ça (enfin dans ce genre) :


  if(isset($HTTP_POST_VARS)){
  reset($HTTP_POST_VARS);
  foreach($HTTP_POST_VARS as $k=>$elem){
	  
    $content_dir = ''; // dossier où sera déplacé le fichier

    $tmp_file = $_FILES['$elem']['tmp_name'];

    if( !is_uploaded_file($tmp_file) )
    {
        exit("Le fichier est introuvable");
    }


Quand penses-tu ?
Modifié par benouille68 (13 Jun 2008 - 16:22)
benouille68 a écrit :
Quand penses-tu ?
J'en pense que $HTTP_POST_VARS est obsolète depuis déjà un bon moment (remplacé par $_POST) et qu'en l'occurrence ce qui t'intéresse est le tableau superglobal $_FILES Smiley langue !

Un pitit test :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>test</title>
	<style type="text/css" media="screen,projection">
	<!--
	
	-->
	</style>
</head>
<body>
<?php
if (!empty($_FILES)) {
	foreach($_FILES as $k=>$elem){
		echo "nom du fichier : $k<br />\n";
		foreach($elem as $key=>$value){
			echo "\t $key => $value<br />\n";
		}
		$tmp_file = $_FILES[$k]['tmp_name'];
		if( !is_uploaded_file($tmp_file) )
		{
			exit("Le fichier est introuvable");
		}
	}
}
?>
<form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<p>
<input type="file" name="fichier1" />
<input type="file" name="fichier2" />
<input type="file" name="fichier3" />
<input type="submit" />
</p>
</form>
</body>
</html>

Modifié par Heyoan (07 Nov 2008 - 16:41)
Pages :