2015-09-17 5 views
1

Я написал скрипт PHP, который сканирует каталог для файлов PDF, а затем создает HTML-страницу со списком этих файлов и их относительной ссылкой. Имя файла будет использовано для элементов списка.PHP: безопасно преобразовать имя файла в URL-адрес

Как я могу обеспечить хорошую совместимость между специальными символами и URL?

Например, у меня есть файл, который содержит text 49% text.pdf, и сервер отвечает на URL http://localhost/folder/text%2049%%20text.pdf с ошибкой Bad Request.

Я пробовал использовать urlencode() без каких-либо успехов. Как я могу улучшить свой сценарий?

UPDATE

urlencode() возвращает меня <a href="text+49%25+text.pdf">text 49% text.pdf</a>, и с этим я получаю ошибку Bad Request.

+2

Я думаю, что если у вас есть файл с именем «text 49% text.pdf» физически на вашем сервере, это плохо. Вам необходимо переименовать файл, прежде чем сохранять его на своем сервере. поэтому, если вы загрузите «text é text.pdf», измените его имя на «text_e_text.pdf», например! Это предотвратит эти ошибки URL-адреса;) – Fky

+0

Поскольку я использую имя файла для заполнения списка, я избегал подчеркивания, которое я обычно использую для каждого файла, который я размещал на сервере. Я знаю, что я могу избежать их, но не существует способа добиться того, что изначально было запрошено? ** PS ** ошибка приходит даже с вашим решением – vismark

+0

Не можете ли вы избежать символа% внутри имени файла? @ Vismark –

ответ

1

Вы должны использовать rawurlencode(). Это будет конвертировать как% в% 25, ​​так и пробелы в% 20

+0

Спасибо Subin! Это работает :) – vismark

0

text%2049%%20text.pdf, дающий вам Bad Request. Поскольку 49% следует кодировать как 49%25.

Ссылка результат должен быть таким: <a href="text%2049%25%20text.pdf"> text 49% text.pdf</a>

Я использую urlencode() для этого без проблем.

Извините, что не публикуйте в качестве комментария, не хватает места.

+0

Я знаю, что процент в URL-адресе экранируется с помощью '% 25', и я могу сделать это вручную, но разве нет функции типа' urlencode() ', чтобы избежать всех этих странных ситуаций, поскольку я, возможно, не предвидел их всех? Я не могу проверить, работает ли он каждый раз, когда новый файл загружается специальным символом в имени ... – vismark

+0

Не беспокойтесь, но, как я уже сказал в вопросе, 'urlencode()' не работает в этот случай ... – vismark