2009-05-13 31 views
9

¿Cómo puedo obtener el nombre de archivo de un archivo antes de llamar a laColdFusion: obtener el nombre de un archivo antes de subir

<cffile action = "upload"> 

? Puedo obtener el nombre de archivo del archivo temporal, pero no el nombre real. En PHP, 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 me gustaría hacer este lado del servidor.

Gracias

+7

lo extraordinariamente típico de ColdFusion no tienen tal funcionalidad básica. – Teekin

Respuesta

7

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

Cuando llama al <cffile action="upload"> puede 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 necesite con el nombre de archivo original.

+0

Gracias por la respuesta ... Consideramos esta solución como parece ser la única manera. Aunque dejaré esta pregunta abierta para obtener más respuestas ... Pero no creo que podamos mejorar mucho más de lo que publicaste. – nlaq

+0

Esto genera problemas cuando realiza varias solicitudes ** de carga de archivos ** en sucesión –

-1

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

Nos da el nombre de archivo tmp, que no queremos ... – nlaq

+0

Vaya, dejé el enctype. Ahora me modifico. –

0

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

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

+0

Sí, también hemos considerado esto. Pero no puede contar con que sus usuarios no manejen un feroz FireBug para hacer su vida miserable. Supongo que puede devolver la solicitud y marcar al usuario si encuentra que la variable del cliente (una vez que carga y obtiene el nombre real) ... Pero me gustaría una solución más eficiente. Gracias por la respuesta :) – nlaq

1

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 en varios idiomas. Funcionará igual de bien en RoR, PHP, JSP, etc.

Edit: 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?

-1

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.

2

¡GUAU, encontré una gran y fácil solución! con un pequeño javascript

De esta forma se obtiene el nombre de archivo temporal para la carga de cffile y el archivo real.jpg nombre de 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> 
6

estoy usando Railo y ha encontrado los nombres de los archivos originales con:

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

tal vez esto funciona en un servidor de Adobe así? es bastante útil si desea cambiar el nombre de su archivo cargado de alguna manera y no desea que se mueva a través de dos directorios temporales (consulte Renaming Files As They Are Uploaded (how CFFILE actually works))

+0

Gracias, necesitaba esto exactamente. ¡Funciona de maravilla! – Mattijs

+0

Para su información, esto solo funciona en Railo, no en Adobe ColdFusion. Vea mi respuesta sobre cómo hacer esto en Adobe ColdFusion. –

14

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

+0

¡Funciona! Gracias. Parece una locura que sea tan difícil sacar algo tan básico de la solicitud, pero esa es la vida de un desarrollador de CF. –

+0

¡Función ingeniosa! Gracias. Confirmado para trabajar en ColdFusion 10. – PhilNicholas

Cuestiones relacionadas