coldfusion file-upload

ColdFusion: obtenga el nombre de un archivo antes de cargarlo



file-upload (8)

No sé de una manera de averiguarlo antes de llamar a cffile, pero puede haber una solución.

Cuando llamas a <cffile action="upload"> puedes especificar un resultado usando result="variable" . Por lo tanto, llame a la carga con el destino como un archivo temporal. Su variable de resultado es una estructura que contiene el miembro clientFile, que es el nombre del archivo en la computadora del cliente.

Ahora puede usar <cffile action="move"> para hacer lo que sea que necesite hacer con el nombre de archivo original.

¿Cómo puedo obtener el nombre de archivo de un archivo antes de llamar al

<cffile action = "upload">

? Puedo obtener el nombre del archivo temporal, pero no el nombre del archivo. En PHP land puedo usar $ _FILES superglobal para obtener lo que quiero, pero hasta donde sé, no existe tal cosa en ColdFusion.

Puedo obtener el nombre de archivo del lado del cliente, pero realmente quiero hacer este lado del servidor.

Gracias


Otra opción podría ser que el código del lado del cliente llene un campo de formulario oculto con el nombre de archivo, que luego tendría en el lado del servidor.

Sin embargo, la respuesta de Ben Doom es, en general, cómo me gustaría abordarla.


Si tiene el atributo de nombre definido en el control de entrada, el nombre del archivo estará en el alcance de FORMULARIO. Por ejemplo:

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


Así es como lo hacemos. Básicamente, hay un campo de archivo y un campo de cadena. JavaScript toma el nombre del archivo desde el navegador antes de enviar el formulario. Obviamente, debe verificar que el nombre de archivo en el otro extremo esté realmente presente (estará en blanco si el usuario tiene JavaScript desactivado, por ejemplo) y deberá analizar la cadena para manejar las diferencias de plataforma ( /users/bob/file.jpg versus 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>

Por cierto, esta técnica es de lenguaje cruzado. Funcionará igual de bien en RoR, PHP, JSP, etc.

Editar: Si un usuario está "empuñando un FireBug feroz", ¿cuál es el problema? Incluso si no tienen Firebug, aún pueden cambiar el nombre del archivo en su extremo y cambiar la entrada. Además, estás validando tus entradas, ¿verdad?


No hay forma de saber el nombre del archivo para los archivos cargados antes de guardarlo en ColdFuson, Railo o OpenBD. Normalmente genero ''mi'' nuevo nombre de archivo usando la función createUUID () antes de guardar el archivo.


¡GUAU, encontré una solución genial y fácil! con un poco de javascript

De esta manera obtienes el nombre de archivo temporal para la carga cffile y el nombre real file.jpg para la base de datos

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


Estoy usando Railo y encontré los nombres de archivo originales con:

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

tal vez esto también funciona en un servidor de adobe? es bastante útil si desea cambiar el nombre de su archivo cargado de alguna manera y no quiere que se mueva a través de dos directorios temporales (consulte Cambiar el nombre de los archivos a medida que se cargan (cómo funciona en realidad CFFILE) )


Sí, esto es posible. Puede usar esta función para tomar el nombre del archivo del cliente antes de usar la etiqueta 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>

Más información aquí: http://www.stillnetstudios.com/get-filename-before-calling-cffile/