2009-05-13 5 views
9

Wie kann ich den Dateinamen einer Datei, bevor ich die Coldfusion: den Namen einer Datei erhalten, bevor das Hochladen

<cffile action = "upload"> 

nennen? Ich kann den Dateinamen der temporären Datei abrufen, aber nicht den tatsächlichen Dateinamen. In PHP Land kann ich den Superglobal $ _FILES verwenden, um zu bekommen, was ich will - aber soweit ich das beurteilen kann, gibt es in ColdFusion so etwas nicht.

Ich kann den Dateinamen clientseitig erhalten, aber würde wirklich diese Serverseite tun wollen.

Dank

+7

Wie außerordentlich typisch für Coldfusion nicht solche grundlegenden Funktionen zu haben. – Teekin

Antwort

7

Ich weiß nicht, von einer Art und Weise vor dem Aufruf cffile, um herauszufinden, aber es kann eine Abhilfe sein. Wenn Sie <cffile action="upload"> anrufen, können Sie ein Ergebnis mit result="variable" angeben. Rufen Sie den Upload mit dem Ziel als temporäre Datei auf. Ihre Ergebnisvariable ist eine Struktur, die das Member clientFile enthält. Dies ist der Name der Datei auf dem Computer des Clients.

Jetzt können Sie <cffile action="move"> tun, was immer Sie mit dem ursprünglichen Dateinamen tun müssen.

+0

Danke für die Antwort ... Wir haben diese Lösung als die einzige Möglichkeit betrachtet. Ich werde diese Frage jedoch für weitere Antworten offen lassen ... Aber ich denke nicht, dass wir viel besser werden können als das, was du gepostet hast. – nlaq

+0

Dies gibt Probleme, wenn Sie mehrere ** Datei-Upload ** Anfragen in Folge machen –

-1

Wenn Sie das Namensattribut für das Eingabesteuerelement definiert haben, befindet sich der Dateiname im FORM-Gültigkeitsbereich. Zum Beispiel:

<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

Das gibt uns den tmp-Dateinamen, den wir nicht wollen ... – nlaq

+0

Whoops, ich habe den Enctype weggelassen. Jetzt, um mich selbst zu verkleinern. –

0

Eine weitere Option könnte sein, clientseitigen Code zu haben, ein verstecktes Formularfeld mit dem Dateinamen zu füllen, die Sie würde dann Server-Seite.

Ben Dooms Antwort ist allgemein, wie ich es annähme, obwohl.

+0

Ja, wir haben das auch berücksichtigt. Aber Sie können sich nicht darauf verlassen, dass Ihre Benutzer keinen heftigen FireBug ausführen, um Ihr Leben miserabel zu machen. Ich nehme an, Sie können die Anfrage zurückwerfen und den Benutzer kennzeichnen, wenn Sie feststellen, dass die Clientseite variiert (sobald Sie den Upload durchführen und den richtigen Dateinamen erhalten) ... Aber ich hätte gerne eine elegantere Lösung. Danke für die Antwort :) – nlaq

1

So machen wir es. Grundsätzlich gibt es ein Dateifeld und ein Zeichenfolgenfeld. JavaScript greift den Dateinamen aus dem Browser, bevor das Formular gesendet wird. Offensichtlich müssen Sie überprüfen, ob der Dateiname am anderen Ende tatsächlich vorhanden ist (er ist leer, wenn der Benutzer beispielsweise JavaScript deaktiviert hat), und Sie müssen die Zeichenfolge analysieren, um Plattformdifferenzen zu behandeln (/users/bob/file.jpg gegenüber C:\Documents and Settings\bob\file.jpg).

<script> 
    function WriteClientFileName(){ 
     $('ClientFileName').value = $('ClientFile').value; 
    } 
</script> 

<form enctype="multipart/form-data" onsubmit="WriteClientFileName();"> 

    <input type="File" name="ClientFile" id="ClientFile"> 
    <input type="hidden" name="ClientFileName" id="ClientFileName" value=""> 

    <input type="submit"> 
</form> 

Übrigens ist diese Technik sprachübergreifend. Es wird genauso gut in RoR, PHP, JSP usw. funktionieren.

Bearbeiten: Wenn ein Benutzer "einen heftigen FireBug ausübt", was ist das Problem? Selbst wenn sie keinen Firebug haben, können sie die Datei an ihrem Ende umbenennen und die Eingabe ändern. Außerdem validieren Sie Ihre Eingaben, oder?

-1

Es gibt keine Möglichkeit, den Dateinamen für hochgeladene Dateien zu kennen, bevor sie auf dem Server in ColdFuson, Railo oder OpenBD gespeichert werden. Normalerweise erzeuge ich 'meinen' neuen Dateinamen mit der Funktion createUUID(), bevor die Datei gespeichert wird.

2

WOW, ich fand eine großartige und einfache Lösung! Mit ein wenig Javascript

Auf diese Weise erhalten Sie den Temp-Dateinamen für den Cffile-Upload und die eigentliche Datei.jpg Namen für die Datenbank

<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

Ich bin mit Railo und fand die ursprünglichen Dateinamen mit:

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

vielleicht dies auch auf einem Adobe-Server funktioniert? es ist ziemlich praktisch, wenn Sie Ihre hochgeladene Datei irgendwie umbenennen wollen und nicht durch zwei Temp-Dirs bewegt werden wollen (siehe Renaming Files As They Are Uploaded (how CFFILE actually works))

+0

Danke, ich brauchte das genau. Klappt wunderbar! – Mattijs

+0

FYI das funktioniert nur in Railo, nicht Adobe ColdFusion. Sehen Sie meine Antwort, wie Sie dies in Adobe ColdFusion tun. –

14

Ja, das ist möglich. Sie können diese Funktion verwenden, um die Client-Dateinamen zu greifen, bevor die cffile-Tag:

<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> 

Mehr Infos hier: http://www.stillnetstudios.com/get-filename-before-calling-cffile/

+0

Es funktioniert! Vielen Dank. Es scheint verrückt, dass es so schwierig ist, eine so grundlegende Sache aus der Anfrage zu bekommen, aber das ist das Leben eines CF-Entwicklers. –

+0

Schlaue Funktion! Vielen Dank. Bestätigt, um in ColdFusion 10 zu arbeiten. – PhilNicholas

Verwandte Themen