Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Outils > XMLRAD
XMLRAD Environnement de développement Web XML/XSL. Avant de poster -> F.A.Q XMLRAD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/09/2005, 14h03   #1
Membre régulier
 
Inscription : septembre 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 114
Points : 84
Points : 84
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 :
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
johan_barbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2005, 14h04   #2
Membre régulier
 
Inscription : septembre 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 114
Points : 84
Points : 84
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 :-)
johan_barbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2005, 15h26   #3
Membre régulier
 
Inscription : septembre 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 114
Points : 84
Points : 84
De la même manière, finalement, si je n'utilise que ce script js :

Code :
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 :
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 :
1
2
 
//SubmitForm('UploadForm',  'ACTION', XMLC_BaseHRef + 'ImportFileName');
je n'ai que mon upload , ma base n'est pas mise à jour.

:-(
[/code]
johan_barbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2005, 15h47   #4
Membre habitué
 
Inscription : novembre 2002
Messages : 243
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 243
Points : 149
Points : 149
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
Pierre FORAZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2005, 15h49   #5
Membre éclairé
 
Inscription : janvier 2003
Messages : 284
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 284
Points : 311
Points : 311
Envoyer un message via MSN à Nicolas.Cogi
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
Nicolas.Cogi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2005, 15h54   #6
Membre régulier
 
Inscription : septembre 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 114
Points : 84
Points : 84
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 ?
johan_barbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2005, 17h44   #7
Membre régulier
 
Inscription : septembre 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 114
Points : 84
Points : 84
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 :
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. :-(
johan_barbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2005, 13h51   #8
Membre éclairé
 
Inscription : janvier 2003
Messages : 284
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 284
Points : 311
Points : 311
Envoyer un message via MSN à Nicolas.Cogi
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 :
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
Nicolas.Cogi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2005, 12h02   #9
Membre régulier
 
Inscription : septembre 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 114
Points : 84
Points : 84
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 :-)
johan_barbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h04.


 
 
 
 
Partenaires

Hébergement Web