2010-01-14 9 views
5

Tengo una carga de archivo muy simple que permite a los usuarios cargar archivos PDF. En otra página, luego hago referencia a esos archivos a través de una etiqueta de anclaje. Sin embargo, parece que cuando un usuario carga un archivo que contiene el signo de libra (#), rompe la etiqueta de anclaje. No causa ningún tipo de error de Coldfusion, simplemente no puede encontrar el archivo. Si elimino el #, funciona bien. Estoy seguro de que hay varios otros personajes que tendrían este mismo problema.Signo de libra (#) en el nombre del archivo que causa el error

He intentado poner URLEncodedFormat() alrededor del nombre del archivo dentro del delimitador pero eso no ayuda. La única otra cosa en la que podía pensar era cambiar el nombre del archivo cada vez que se cargaba y eliminar el carácter "#" (y cualquier otro carácter "malo").

Tiene que haber una solución más fácil. ¿Algunas ideas?

+0

cambie el nombre del archivo cada vez que se cargó y elimine el carácter "#" (y cualquier otro carácter "incorrecto"). Sip. – Henry

Respuesta

5

Si controlas el código de carga de archivos intento de validar la cadena con

IsValid("url",usersFileName) or 
IsValid("regex",usersFileName,"[a-zA-Z0-9]") 

De lo contrario si se siente cómodo con la expresión regular que sugeriría algo así como los críticos anteriores están comentando

REReplace(usersfilename,"[^a-zA-Z0-9]","","ALL") 

Estas muestras supongamos que agregará el ".pdf" y solo permite letras y números. Si necesita subrayado o el período que se vería así ...

REReplace(usersfilename,"[^a-zA-Z0-9\._]","","ALL") 

no soy un gurú de expresiones regulares, si tengo uno de estos mal estoy seguro de varias saltará y corregirme :)

+1

Sí, hacemos algo similar a la última expresión. Pero reemplace los caracteres eliminados con algo como "_" para que sea obvio que el nombre del archivo fue alterado. Estrictamente preferencia personal aunque :) – Leigh

+0

Este es un enfoque bastante bueno. Ojalá hubiera pensado en eso. –

+0

Esto es más o menos lo que hago. Al igual que Leigh, reemplazo todos los caracteres sustituidos con '_' como una alerta para el usuario. – ale

0

Los signos de libra no son legales dentro de los nombres de archivo en la web. Se utilizan para objetivos de anclaje en páginas:

<a name="target"> 

Así que si usted tiene el archivo # name.pdf, el navegador está buscando realmente el "archivo" archivo y el ancla "name.pdf" interno.

Sí, tendrá que cambiar el nombre de sus archivos al cargarlos.

+0

Entiendo que tendré que cambiar el nombre. Mi pregunta sería cuál es la solución más fácil para cuidar el carácter # así como cualquier otra que pueda causar problemas. – Jason

+0

echa un vistazo a replace() o replaceList() – Henry

+1

@Ben - Podría estar equivocado, pero no creo que tenga que "renombrar". La correcta codificación del signo # debería funcionar (es decir, el archivo% 23.pdf). Pero sí estoy de acuerdo en que cambiar de nombre es la mejor opción aquí (especialmente dada la sensibilidad de CF a #). – Leigh

-1

Probablemente tendrías que reemplazar # con ## para evitar esto, creo que esto es causado porque # figura como la palabra clave Coldfusion.

+2

No hay problemas en Coldfusion. El problema es que lo lee como un ancla nombrada en la página. – Jason

0

No puedo comentar aún, pero la solución de Kevink es buena a menos que necesites conservar lo que estás reemplazando.

Nos encontramos con una instancia en la que necesitábamos cambiar el nombre del nombre de archivo pero el nombre de archivo debía conservarse en cierta medida (requisito de usuario). Simplemente eliminar los caracteres especiales no era una opción. Como resultado, tuvimos que manejar cada reemplazo individualmente, algo así como.

<cfset newName = replace(thisFile, "##", "(pound)", "All")> 
<cfset newName = replace(newName , "&", "(amp)", "All")> 
<cffile action="rename"source = "#ExpandPath("\uploads\#thisFolder#\#thisFile#")#" destination = "#newName#"> 
Cuestiones relacionadas