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

XMLRAD Discussion :

Upload et enregistrement du nom du fichier dans une bdd


Sujet :

XMLRAD

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Points : 103
    Points
    103
    Par défaut Upload et enregistrement du nom du fichier dans une bdd
    Bonjour,

    je travaille avec XMLRAD 2005 + Delphi + SQL server

    Actuellement, je cherche simplement à permettre l'upload d'un fichier au travers un formulaire, à enregistrer ce fichier sur le disque, et à insérer le nom de ce fichier dans ma base.

    Voici ce que j'ai fini par faire, me rendant compte que l'enctype de la balise <form> posait quelques problèmes pour l'enregistrement du nom dans la base (j'avais un enregistrement vide).

    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
    39
    40
    41
    42
    43
    44
    45
     
    <script language="javascript"><![CDATA[function Upload() {
      var File = GetFieldValue('UploadForm', 'FileToAttach');
      if (File != '')
      {
        document.body.style.cursor = 'wait';
        SubmitForm('UploadForm',  'ACTION', XMLC_BaseHRef + 'XMLC_UploadFile');
        //SubmitForm('ProcessUpload');
        SetField ('ProcessUpload', 'FileToImport', File);
        SubmitForm('ProcessUpload',  'ACTION', XMLC_BaseHRef + 'ImportFileName');
      }
    }]]>
     
    <form action="{/document/Aliases/MADLL}XMLC_UploadFile" method="POST" name="UploadForm" enctype="multipart/form-data">
    					<input type="hidden" name="NextAction" value="Import"/>
    					<input type="hidden" name="XMLC_RequestID" value="{/document/Params/XMLC_RequestID}"/>
    					<table border="0" width="100%">
    						<tr>
    							<td width="30%">
    								<xsl:value-of select="/document/Locales/CalendarFieldName"/>
    							</td>
    							<td width="70%">
    								<input type="file" name="FileToAttach" style="width:100%"/>
    							</td>
    						</tr>
    					</table>
    					<center>
    						<table>
    							<tr>
    								<td>
    									<xsl:call-template name="xslc:Button">
    										<xsl:with-param name="Caption">
    											<xsl:value-of select="/document/Locales/ButtonValidCalendar"/>
    										</xsl:with-param>
    										<xsl:with-param name="OnClick">Upload();</xsl:with-param>
    									</xsl:call-template>
    								</td>
    							</tr>
    						</table>
    					</center>
    				</form>
    	<form action="{/document/Aliases/MADLL}ImportFileName" method="POST" name="ProcessUpload">
    					<input type="hidden" name="NextAction" value="Import"/>
    					<input type="hidden" name="FileToImport"  />
    				</form>
    Le problème étant ici que :
    si j'enlève de ma fonction le submit de ProcessUpload, j'ai mon fichier uploadé...mais rien dans ma base (un fichier vide).
    Si je le laisse, j'ai bien mon nom enregistré dans ma base, mais le fichier n'est pas sauvegardé dans son répertoire :-(

    Une idée?

    Merci par avance!

    Johan

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Points : 103
    Points
    103
    Par défaut
    J'ai évidemment mis uniquement le code incréminé, et j'ai oublié de fermer ma balise script. mais c'est uniquement dans ce copier/coller, mon code est correct dans le xsl :-)

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Points : 103
    Points
    103
    Par défaut
    De la même manière, finalement, si je n'utilise que ce script js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <script type="text/javascript"><![CDATA[function Upload() {
      var File = GetFieldValue('UploadForm', 'FileToAttach');
      if (File != '')
      {
        SetField ('UploadForm', 'FileToImport', File);
        document.body.style.cursor = 'wait';
        SubmitForm('UploadForm',  'ACTION', XMLC_BaseHRef + 'XMLC_UploadFile');
        SubmitForm('UploadForm',  'ACTION', XMLC_BaseHRef + 'ImportFileName');
      }
    }]]></script>
    En ajoutant à mon formulaire de départ UploadForm un champ de type "hidden" se nommant "FileToImport" :

    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
     
    <form action="{/document/Aliases/MADLL}ImportFileName" method="POST" name="UploadForm" enctype="multipart/form-data">
    					<input type="hidden" name="NextAction" value="Import"/>
    					<input type="hidden" name="XMLC_RequestID" value="{/document/Params/XMLC_RequestID}"/>
    					<table border="0" width="100%">
    						<tr>
    							<td width="30%">
    								<xsl:value-of select="/document/Locales/CalendarFieldName"/>
    							</td>
    							<td width="70%">
    								<input type="file" name="FileToAttach" style="width:100%"/>
    								<input type="hidden" name="FileToImport"/>
    							</td>
    						</tr>
    					</table>
    					<center>
    						<table>
    							<tr>
    								<td>
    									<xsl:call-template name="xslc:Button">
    										<xsl:with-param name="Caption">
    											<xsl:value-of select="/document/Locales/ButtonValidCalendar"/>
    										</xsl:with-param>
    										<xsl:with-param name="OnClick">Upload();</xsl:with-param>
    									</xsl:call-template>
    								</td>
    							</tr>
    						</table>
    					</center>
    				</form>
    en l'état : j'ai ma base qui est bien mise à jour, mais pas mon upload.
    Si je commente cette ligne dans mon script js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //SubmitForm('UploadForm',  'ACTION', XMLC_BaseHRef + 'ImportFileName');
    je n'ai que mon upload , ma base n'est pas mise à jour.

    :-(
    [/code]

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2002
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 243
    Points : 192
    Points
    192
    Par défaut
    tu peux regarder sur le site xmlrad.com. Tu tapes upload dans le search et c'est 'File Upload with JavaScript'. Il y a du code qui permet de comprendre comment ça fonctionne

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 284
    Points : 349
    Points
    349
    Par défaut
    Pour manipuler les fichiers uploadés, il te faut un peu de code. C'est ce que fait XMLC_UploadFile, mais lui ne sait pas écrire dans ta base de données.

    Avec ton exemple, tu uploades 2 fois le fichier, ce qui n'est pas correcte.

    Ce qu'il te faut faire :

    - Creer un XMLService simple avec juste un XMLGram appelé par exemple UploadFile qui se chargera d'écrire sur disque ton fichier comme tu le désires (repertoire fonction de l'utilisateur, etc...) et de créer l'enregistrement dans la base grace au XMLGram.

    Les méthodes dont tu as besoin sont : XMLRequest.GetFileCount, XMLRequest.GetFileNo, XMLRequest.GetFileName. Toutes sont expliquées dans le guide du programmeur dans l'aide XMLRAD sur XMRAD.com (training manual, appendixes).

    La méthode WriteStringToFile de XMLUtils te permettra d'écrire le fichier sur disque, là où tu veux.

    Le code utilisé par XMLC_UploadFile est lisible dans l'unité XMLUtilsWM.pas fournie.
    Nicolas

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Points : 103
    Points
    103
    Par défaut
    Merci de ta réponse.
    Mais ImportFileName est un xmlgram tout simple chargé d'écrire le nom dans la base. Il fonctionne très bien. C'est l'upload qui ne passe pas quand je soumets aussi vers ImportFileName.

    Bref, si j'ai bien compris, je garde mon smlgram, et j'y ajoute du code permettant d'uploader le fichier, et je ne passe pas par XMLC_UploadFile ?

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Points : 103
    Points
    103
    Par défaut
    Bon eh bien je ne m'en sors toujours pas.

    J'ai mis comme action XMLC_UploadFile

    Mon js soumets ce formulaire, puis le soumets en l'envoyant à ImportFileName;

    Ce xmlgram ImportFileName comporte ceci comme code Delphi :
    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
     
    procedure TMonUnite.ImportFileNameBeforeXMLGram(XMLGram: IXMLGram; InputDoc,
      OutputDoc: IXMLCursor; var Skip: Boolean);
    var
      Count: Integer;
      FileName: WideString;
      I: Integer;
    begin
      Count := XMLRequest.GetFileCount;
      for I := 0 to Count-1 do
      begin
        FileName := XMLRequest.GetFileName(I);
        ShowMessage (FileName);
        Context.SetValue('FILE_NAME', FileName);
        //WriteStringToFile(XMLRequest.GetFileNo(I), FileName, False);
        XMLRequest.SaveFileNo(I, FileName);
      end;
    end;
    Pui sje récupère le context pour inscrire le nom du fichier dans ma base.

    Le ShowMessage m'affiche bien le nom de mon fichier, mais rien n'est écrit dans mon répertoire d'upload. Ma base, elle, est bien mise à jour.

    Même si je me contente de soumettre une fois mon formulaire, j'ai le même problème. : soit j'uploade, soit j'écris dans ma base, pas les deux en même temps. :-(

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 284
    Points : 349
    Points
    349
    Par défaut
    il ne faut pas poster 2 fois : tu uploades ton fichier 1 seule fois, vers une seule action, qui fait tout. C'est ce que dois faire ton ImportFileName, donc t'es pas tres loin

    le XMLRequest.SaveFileNo, c'est niquel : je t'avais parlé de WriteStringToFile, mais c'etait une erreur de ma part. SaveFileNo est la bonne methode.

    En revanche ton filename est pas correcte : il ne contient pas de repertoire.

    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
     
    procedure TMonUnite.ImportFileNameBeforeXMLGram(XMLGram: IXMLGram; InputDoc, OutputDoc: IXMLCursor; var Skip: Boolean); 
    var 
      Count: Integer; 
      FileName: WideString; 
      I: Integer; 
    begin 
      Count := XMLRequest.GetFileCount; 
      for I := 0 to Count-1 do 
      begin 
        FileName := XMLRequest.GetFileName(I); 
        Context.SetValue('FILE_NAME', FileName); 
        FileName := ConcatDir(XMLApplication.InitParams.Values['XMLC_DefaultDataDir'], 'Upload', True) + FileName;
        XMLRequest.SaveFileNo(I, FileName); 
      end; 
    end;
    Nicolas

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 114
    Points : 103
    Points
    103
    Par défaut
    Yep !!

    Merci beaucoup pour ton aide Nicolas :-) Tout marche parfaitement bien maintenant. En effet, je n'avais pas compris que je devais préciser le répertoire d'upload, je pensais que les définitions dans les paramètres suffisaient.

    Tout va bien maintenant.

    Merci donc à tous les deux pour vos explications et votre patience :-)

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

Discussions similaires

  1. Extraire le nom de fichier dans une URL
    Par rezuss dans le forum Delphi
    Réponses: 8
    Dernier message: 17/08/2006, 22h02
  2. Ecrire les noms des fichiers dans une colonne
    Par REGIMBAL dans le forum Access
    Réponses: 1
    Dernier message: 20/04/2006, 11h29
  3. Récupérer des noms de fichiers dans une table ?
    Par florus dans le forum Access
    Réponses: 5
    Dernier message: 25/03/2006, 17h34
  4. Shell: récupérer le bon nom de fichier dans une variable
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 10/01/2006, 11h45
  5. stocker les nom de fichiers dans une base
    Par Corben dans le forum Windows
    Réponses: 2
    Dernier message: 04/01/2006, 15h50

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