2013-07-16 7 views
1

К сожалению, я разрешил пользователям загружать файлы на сервер, не сначала дезинфицируя свои имена (Linux, PHP, MySQL).Как открыть этот файл?

Один из загруженного файла является «E_M_20-06-2013_14-15_ComidasTípicas.zip» (это правильно в базе данных MySQL, UTF-8 кодируются).

Но когда я пытаюсь сделать fopen() в PHP, я не могу найти этот файл. В зависимости от локализации (LANG) я получить различные имена файлов, как таковой:

$ export LANG=pt_BR.UTF-8 
    $ ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT* 
    ../web/downloads/E_M_20-06-2013_14-15_ComidasTípicas.zip 

    $ export LANG=pt_BR.ISO-8859-1 
    $ ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT* 
    ../web/downloads/E_M_20-06-2013_14-15_ComidasT▒?­picas.zip 

    $ export LANG=C        
    $ ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT* 
    ../web/downloads/E_M_20-06-2013_14-15_ComidasT????picas.zip 

Может кто-нибудь мне помочь в раскрытии, как я могу открыть этот файл с помощью PHP?

PS: Конечно, я пробовал utf8_encode, utf8_decode, no sucess.

Заранее благодарен!

+0

Какое кодирование ваш файл PHP в? Как вы 'fopen()' файл, откуда берется имя файла? –

ответ

0

Написать скрипт, который находит файлы и переименовывает файл без искаженных символов (не алфавитно-цифровой и подчеркивающий)

Проверьте ScanDir, чтобы найти файлы http://php.net/manual/en/function.scandir.php

Проверить эту нить, чтобы найти не буквенно-цифровые символы PHP Regular expression - Remove all non-alphanumeric characters

Итак, вы получите чистые имена файлов и как указано в вашей базе данных. При необходимости вы можете выполнить ту же операцию в поле базы данных.

+0

Если базовая файловая система поддерживает UTF-8, имена файлов будут работать без очистки даже с PHP-скрипта. Это нужно сделать правильно. –

+0

У меня есть процедура очистки имени файла, написанная на PHP; Я могу использовать его для файлов, хранящихся в базе данных и в файловой системе. Но я не могу понять, почему ** rename ($ old_filename, $ new_filename) ** не удается сказать, что он не может найти файл с акцентированными символами ($ old_filename). BTW, я использую файловую систему Debian Linux, EXT4. –

+0

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

0

Пожалуйста, попробуйте использовать:

$ export LANG=en_US.UTF-8 

Что означает в PHP:

setlocale(LC_ALL, 'en_US.UTF8'); 
+0

же странная вещь: # экспорт LANG = en_US.UTF-8 # Ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT* ../web/downloads/E_M_20-06-2013_14-15_ComidasTÃpicas.zip –

+0

Попробуйте ввести 'locale -a', чтобы получить список установленных локалей. Если en_US.UTF-8 отсутствует, вы должны установить его первым. – giusc

Смежные вопросы