2009-05-13 9 views
9

Comment puis-je obtenir le nom d'un fichier avant d'appeler leColdFusion: obtenir le nom d'un fichier avant de le télécharger

<cffile action = "upload"> 

? Je peux obtenir le nom de fichier du fichier temporaire, mais pas le nom de fichier réel. En PHP, je peux utiliser le superglobal $ _FILES pour obtenir ce que je veux - mais pour autant que je sache, aucune telle chose n'existe dans ColdFusion.

Je peux obtenir le nom de fichier côté client, mais je voudrais vraiment faire ce côté serveur.

Merci

+7

Comment extraordinairement typique de ColdFusion ne pas avoir de telles fonctionnalités de base. – Teekin

Répondre

7

Je ne sais pas d'un moyen de savoir avant d'appeler cffile, mais il peut y avoir une solution de contournement.

Lorsque vous appelez <cffile action="upload">, vous pouvez spécifier un résultat à l'aide de result="variable". Ainsi, appelez le téléchargement avec la destination en tant que fichier temporaire. Votre variable de résultat est une structure qui contient le membre clientFile, qui est le nom du fichier sur l'ordinateur du client.

Maintenant, vous pouvez utiliser <cffile action="move"> pour faire tout ce que vous devez faire avec le nom de fichier d'origine.

+0

Merci pour la réponse ... Nous avons considéré cette solution car elle semble être la seule solution. Je vais laisser cette question ouverte pour d'autres réponses ... Mais je ne pense pas que nous puissions obtenir beaucoup mieux que ce que vous avez posté. – nlaq

+0

Cela pose des problèmes lorsque vous effectuez plusieurs requêtes ** de téléchargement de fichiers ** successivement. –

-1

Si vous avez défini l'attribut name sur le contrôle d'entrée, le nom du fichier se trouvera dans l'étendue FORM. Par exemple:

<cfif not structIsEmpty(form)> 
    <cfdump var="#form#"> 
<cfelse> 
    <html> 
    <head> 
     <title>Title</title> 
    </head> 
    <body> 
     <form method="POST" action="#cgi.SCRIPT_NAME#"> 
      <input type="file" name="fileIn" /> 
      <input type="Submit" name="formSubmit"> 
     </form> 
    </body> 
    </html> 
</cfif> 
+1

Le nom de fichier tmp est donné, ce que nous ne voulons pas ... – nlaq

+0

Oups, j'ai laissé tomber l'enctype. Maintenant, pour me modérer. –

0

Une autre option pourrait être d'avoir le code côté client remplir un champ de formulaire caché avec le nom de fichier, que vous auriez alors côté serveur.

La réponse de Ben Doom est généralement comment je l'aborderais, cependant.

+0

Ouais, nous avons considéré cela aussi. Mais vous ne pouvez pas compter sur vos utilisateurs ne brandissant pas un FireBug féroce pour rendre votre vie misérable. Je suppose que vous pouvez renvoyer la demande et signaler l'utilisateur si vous trouvez que le client a menti (une fois que vous faites le téléchargement et obtenez le vrai nom de fichier) ... Mais je voudrais une solution plus élégante. Merci pour la réponse si :) – nlaq

1

Voici comment nous le faisons. Fondamentalement, il y a un champ de fichier, et un champ de chaîne. JavaScript récupère le nom de fichier du navigateur avant que le formulaire ne soit soumis. Évidemment, vous devez vérifier que le nom de fichier à l'autre extrémité est effectivement présent (il sera vide si l'utilisateur a JavaScript désactivé, par exemple) et vous devrez analyser la chaîne pour gérer les différences de plateforme (/users/bob/file.jpg par rapport à C:\Documents and Settings\bob\file.jpg) Par ailleurs, cette technique est multilingue. Par ailleurs, cette technique est multisupport. Cela fonctionnera tout aussi bien dans RoR, PHP, JSP, etc.

Editer: Si un utilisateur utilise un FireBug féroce, quel est le problème? Même s'ils n'ont pas Firebug, ils peuvent toujours renommer le fichier de leur côté et changer l'entrée. De plus, vous validez vos entrées, n'est-ce pas?

-1

Il est impossible de connaître le nom de fichier des fichiers téléchargés avant de les enregistrer sur le serveur dans ColdFuson, Railo ou OpenBD. Je génère généralement mon nouveau nom de fichier en utilisant la fonction createUUID() avant d'enregistrer le fichier.

2

WOW, j'ai trouvé une solution géniale et facile! avec un peu de javascript

De cette façon, vous obtenez le nom de fichier temporaire pour le téléchargement de fichier et le fichier réel.nom jpg pour la base de données

<html> 
<head> 
<script type="text/javascript"> 
function PassFileName() 
{ 
document.getElementById("fileName").value=document.getElementById("fileUp").value; 
} 
</script> 
</head> 
<body> 
<form name="form1" method="post" enctype="multipart/form-data" > 
File: <input type="file" name="fileUp" id="fileUp" size="20" onchange="PassFileName()" /> <br /> 
Title: <input type="text" name="Title" id="Title"><br /> 
<input type="hidden" id="fileName" size="20" name="fileName" /> 
<input type="submit" name="submit"> 
</form> 
</body> 
</html> 
6

J'utilise Railo et a trouvé les noms de fichiers originaux avec:

GetPageContext().formScope().getUploadResource('your_file_input_form_name').getName();

peut-être cela fonctionne sur un serveur Adobe ainsi? C'est assez pratique si vous voulez renommer votre fichier téléchargé en quelque sorte et ne voulez pas qu'il soit déplacé à travers deux répertoires temporaires (voir Renaming Files As They Are Uploaded (how CFFILE actually works))

+0

Merci, j'avais besoin de cela exactement. Fonctionne comme un charme! – Mattijs

+0

FYI cela ne fonctionne que dans Railo, pas Adobe ColdFusion. Voir ma réponse pour savoir comment faire cela dans Adobe ColdFusion. –

14

Oui, cela est possible. Vous pouvez utiliser cette fonction pour saisir le nom du fichier client avant d'utiliser la balise cffile:

<cffunction name="getClientFileName" returntype="string" output="false" hint=""> 
    <cfargument name="fieldName" required="true" type="string" hint="Name of the Form field" /> 

    <cfset var tmpPartsArray = Form.getPartsArray() /> 

    <cfif IsDefined("tmpPartsArray")> 
     <cfloop array="#tmpPartsArray#" index="local.tmpPart"> 
      <cfif local.tmpPart.isFile() AND local.tmpPart.getName() EQ arguments.fieldName> <!--- ---> 
       <cfreturn local.tmpPart.getFileName() /> 
      </cfif> 
     </cfloop> 
    </cfif> 

    <cfreturn "" /> 
</cffunction> 

Plus d'infos ici: http://www.stillnetstudios.com/get-filename-before-calling-cffile/

+0

Ça marche! Je vous remercie. Il semble fou que c'est si difficile d'obtenir une chose aussi simple de la demande, mais c'est la vie d'un développeur CF. –

+0

Fonction astucieuse! Merci. Confirmé pour travailler dans ColdFusion 10. – PhilNicholas

Questions connexes