Как хранить загруженные файлы с не-ASCII именами файлов? - PullRequest
3 голосов
/ 03 апреля 2012

Я не могу передать имя файла UTF-8 в move_uploaded_file(), поскольку оно преобразуется байтово, что приводит к неправильному имени в файловой системе.Например:

move_uploaded_file($_FILES['userfile']['tmp_name'], '\upload\é.jpg');

создает xa9.jpg в каталоге загрузки.

Хотя Windows API поддерживает UTF-16 , передавая такиеимя файла (например, от iconv('UTF-8', 'UTF-16', 'é')) до move_uploaded_file() приводит к ошибке.

Было бы разумно кодировать процентов всех специальных символов, и я определенноследует сделать то же самое с URI, в соответствии с RFC 3986 .Но когда я использую URI, закодированные в процентах, Apache выдает ошибку 404. Он декодирует URL и ничего не может найти по этому имени.

Например: <img src="/upload/%C3%A9.jpg" /> выдает ошибку Apache:

Файл не существует: […] /upload/\xc3\xa9.jpg.

Какое будет правильное решение?Если я переименую файл в Windows ( é.jpg ), кодированный HTML URI (% C3% A9.jpg ) будет работать, как и ожидалось.


Некоторая информация по теме: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php

1 Ответ

3 голосов
/ 04 апреля 2012

Передача iconv('UTF-8', 'Windows-1250', $_FILES['userfile']['name']) в move_uploaded_file(), в отличие от использования UTF-16 и сохранение имени файла для HTML как rawurlencode($_FILES['userfile']['name']) работает.

Если это имя файла хранится вк базе данных, любой запрос к файлу должен ссылаться на iconv('UTF-8', 'Windows-1250', rawurldecode($filename)).

Я использую набор символов Windows-1250, так как он установлен по умолчанию в моей системе.

Дополнительная информация о MSDN:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...