Загрузка файлов PHP — обработка арабских/китайских/японских имен файлов

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

Проблема возникает при попытке загрузить файлы с помощью php:

$result = mysql_query($query) or die('Error, query failed');

list($filename, $type, $filesize, $filepath) = mysql_fetch_array($result);

header("Content-Disposition: attachment; filename=$filename");

header("Content-length: $filesize");

header("Content-type: $type");

readfile($filepath);

Система не распознает имя файла, поэтому не загружает файл. Какие-либо предложения?


person Choog    schedule 08.07.2009    source источник
comment
Можете ли вы напечатать несколько проблемных имен файлов? Кроме того, было бы неплохо описать столбец, который используется для хранения пути к файлу. Подозреваю, что он не был вставлен с правильной кодировкой.   -  person wai    schedule 08.07.2009


Ответы (3)


Я избежал этой проблемы, создав уникальный идентификатор для каждого загруженного файла и переименовав файл с использованием этого идентификатора, а затем сохранив идентификатор, исходное имя файла и расширение в таблице базы данных. Затем вы можете легко найти нужный идентификатор в таблице, получить исходное имя файла (которое вы можете отобразить для удобочитаемости) и расширение, а затем загрузить файл {id}.{extension}.

Это также имеет дополнительное преимущество: если два файла загружены с одинаковым именем, последняя загрузка не перезапишет оригинал.

person defines    schedule 09.07.2009

Сложно загружать имена Unicode, такие как (например, 我是神.doc), вплоть до php 5 и linux, я подозреваю, что различные ОС не поддерживают такие имена файлов.

Одной из альтернатив для вас является загрузка их с некоторыми пользовательскими именами, которые могут быть {file-id}.doc, и сохранение их информации (например, исходного имени файла) в таблице базы данных, а на странице загрузки вы можете изменить заголовки с информацией, хранящейся в таблице, содержащей информацию для этого файла

person Community    schedule 08.07.2009

Если вам нужно сохранить имена файлов в MySQL, убедитесь, что у вас есть правильные параметры сортировки таблиц и столбцов, например utf8_unicode_ci. И не забудьте сделать mysql_query("SET NAMES utf8"); после подключения. Этого должно быть достаточно для правильного хранения и извлечения строк Unicode.

Что касается заголовка Content-Disposition и имен файлов, отличных от ASCII, на это уже есть хороший ответ: «Как кодировать параметр имени файла заголовка Content-Disposition в HTTP?"

person drdaeman    schedule 08.07.2009