Знак фунта (#) в имени файла вызывает ошибку - PullRequest
5 голосов
/ 14 января 2010

У меня очень простая загрузка файлов, которая позволяет пользователям загружать файлы PDF. На другой странице я ссылаюсь на эти файлы через тег привязки. Тем не менее, кажется, что когда пользователь загружает файл, который содержит знак решетки (#), он ломает тег привязки. Это не вызывает никакой ошибки Coldfusion, он просто не может найти файл. Если я удаляю #, он работает просто отлично. Я уверен, что есть ряд других персонажей, которые будут иметь такую ​​же проблему.

Я пытался поместить URLEncodedFormat() вокруг имени файла внутри якоря, но это не помогает. Единственное, о чем я мог подумать, - это переименовывать файл при каждой загрузке и удалять символ «#» (и любой другой «плохой» символ).

Должно быть более простое решение. Есть идеи?

Ответы [ 4 ]

5 голосов
/ 15 января 2010

Если вы управляете кодом загрузки файла, попробуйте проверить строку с помощью

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

В противном случае, если вас устраивает регулярное выражение, я бы предложил что-то похожее на предыдущие постеры, которые комментируют

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

В этих примерах предполагается, что вы добавите «.pdf» и разрешите использовать только буквы и цифры. Если вам нужны подчеркивания или точка, это будет выглядеть следующим образом ...

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

Я не гуру регулярных выражений, если у меня есть один из этих неправильных, я уверен, что несколько подскочит и поправит меня:)

0 голосов
/ 15 января 2010

Я пока не могу комментировать, но решение Кевинка хорошо, если вам не нужно сохранить то, что вы заменяете.

Мы столкнулись с случаем, когда нам нужно было переименовать имя файла, но имя файла нужно было несколько сохранить (требование пользователя). Простое удаление специальных символов не было возможным. В результате нам пришлось обрабатывать каждую замену индивидуально, что-то вроде.

<cfset newName = replace(thisFile, "##", "(pound)", "All")>
<cfset newName = replace(newName , "&", "(amp)", "All")>
<cffile action="rename"source = "#ExpandPath("\uploads\#thisFolder#\#thisFile#")#" destination = "#newName#">
0 голосов
/ 15 января 2010

Возможно, вам придется заменить # на ##, чтобы избежать этого, я думаю, это вызвано тем, что # обозначается как ключевое слово Coldfusion.

0 голосов
/ 15 января 2010

Знаки фунта недопустимы в именах файлов в Интернете. Они используются для целевых привязок на странице:

<a name="target">

Так что если у вас есть файл # name.pdf, браузер фактически ищет файл "file" и внутренний якорь "name.pdf".

Да, вам нужно будет переименовать файлы при загрузке.

...