Я не могу передать имя файла 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