Php загрузка файлов кириллица
Возникла такая проблема: при загрузке файла у которого имя на кириллице имя файла искажается. И скачка файла становится не возможной, есть ли какое нибуть решение этой проблемы? Подскажите любые варианты как это можно сделать.
>
//—
?>
Но смысла в этом мало:
-хостинг может неккоректно обрабатывать такой запрос
-вы получите файл с названием не на русском, а на url коде
-надо учитывать что длинные названия на русском могут не работать
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Получить имена всех файлов, которые были открыты с помощью приложения | Kn793 | Общие вопросы Delphi | 9 | 10.07.2008 15:31 |
Как получить имена нескольких файлов выделенных в OpenDialog | Comer_Jus | Общие вопросы Delphi | 2 | 26.05.2008 19:47 |
как считать имена файлов из директории и поддерикторий в массив, ХЭЛП | uraveselov | Microsoft Office Excel | 2 | 10.04.2008 09:50 |
Есть 2 листбокса, в 1 пути к файлам, во 2 имена этих файлов. delphi. | Xandr | Помощь студентам | 2 | 06.10.2007 00:17 |
Имена хостов 🙁 | InseR | Работа с сетью в Delphi | 1 | 04.07.2007 12:15 |
Php загрузка файлов кириллица
//file archiving - файл для архивирования, в php вместо пробелов не нужно указывать "%20", лучше указывать "_" $file_archiving ='Library/Pravila_doroznogo_dvizeniya_RF.doc'; //file in archive - файл в архиве, в php вместо пробелов не нужно указывать "%20", лучше указывать "_" $file_in_archive ='Library/Pravila_doroznogo_dvizeniya_RF.zip'; //file in archive - файл в архиве, в php вместо пробелов не нужно указывать "%20", лучше указывать "_" $file_archiving1 ='Правила дорожного движения РФ.doc'; //file in archive - файл в архиве, в php вместо пробелов не нужно указывать "%20", лучше указывать "_" $file_in_archive1 ='Правила дорожного движения РФ.zip'; $size = file_size($file_archiving); echo " Скачать файл: $file_archiving1, размер файла: $size"; //if - если, isset — определяет, была ли установлена переменная значением отличным от NULL if (isset($file_archiving)) < //создаётся объект $zip_archive = new ZipArchive(); //if - если, $zip_archive ->open(getcwd()."/$file_in_archive", ZIPARCHIVE::CREATE - открывается новый zip-архив if ($zip_archive -> open(getcwd()."/$file_in_archive", ZIPARCHIVE::CREATE) == TRUE) < //к архиву добавляется файл (это можно повторить несколько раз) $zip_archive ->addFile($file_archiving, $file_archiving); //закрывается созданный архив с сохранением всех добавлений $zip_archive -> close(); $size = file_size($file_in_archive); echo " Или скачать заархивированный файл: $file_in_archive1, размер файла: $size"; > >
я слышал, что нужно забудьть вообще о русском языке в программировании, его там не существует
но тогда может есть прога, которая закидывает файлы на сервер переименовывая их в траслит?
верить — не верить ваше дело. Но то что нативной поддержки кириллицы нет в вебе — да и не только — однозначно. Можно взять и наваять простую функцию на php и пользоваться.
ИМХО . пользователю вообще глубоко начихать как и что называется. лишь была та инфа, которая нужна
Транслитерация загружаемых файлов на PHP
Здравствуйте, я криворукий (ну т.е. начинающий) PHP-программист, и есть у меня такая проблема: у меня есть скрипт загрузки файлов в указанную директорию, но по плачевному стечению обстоятельств — русское наименование файла не может быть ссылкой, поэтому я пробовал сделать транслитерацию загружаемого файла, но у меня ничего не вышло. Поэтому обращаюсь к более опытным PHP-прогерам!
вот собственно сам код загрузки файлов, в котором мне нужно сделать транслитерацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
if ( isset ( $_POST["send"] ) ) { $filetype = array ( 'jpg', 'gif', 'png', 'jpeg', 'bmp' ); //разрешенные форматы $upfiletype = substr( $_FILES['upfile']['name'], strrpos( $_FILES['upfile']['name'], "." ) + 1 ); $direct = '/home/casualrules.ru/www/img/galery/'; //это сама директория, куда заливаются файлы на моем сайте if ( in_array ( $upfiletype, $filetype ) ) { if ( $_FILES["upfile"]["size"] > 1024*1024*10 ) { //это максимальный размер загружаемого файла echo ( "Размер файла превышает допустимый." ); } else { if ( is_uploaded_file ( $_FILES["upfile"]["tmp_name"] ) ) { if ( move_uploaded_file ( $_FILES["upfile"]["tmp_name"], $direct.$_FILES["upfile"]["name"] ) ) { echo "Файл успешно загружен!"; } else { echo "Файл не удалось загрузить на сервер."; } } else { echo "Файл загрузить не удалось."; } } } else { echo "Формат этого файла не подходит для данного раздела сайта!"; } } ?>
Кириллица в параметре Filename заголовка Content-Disposition
Возникла следующая проблема. Имеется веб-приложение (клиент на js, сервер на php) и некое файловое хранилище. Чтобы скачать файл из хранилища, клиентская часть веб-приложения шлет запрос на серверную, там выполняется бизнес логика (проверка прав доступа и т.д.), если все ок, то отдается ссылка на файл. Затем клиентская часть делает редирект на эту ссылку. На сервере файлового хранилища стоит nginx, который и отдает файлы. Имена у файлов представляют собой набор символов без смыслового содержания (просто GUID), что не очень нравилось пользователям. Они хотели бы, чтобы при скачивании у файла было такое же имя, как у соответствующей ему сущности в веб-приложении. Поскольку переименовывать файлы очень не хотелось бы по некоторым причинам, было придумано следующее:
1. При формировании ссылки в серверной части веб-приложения к ней цепляется GET-параметр, в котором содержится приемлемое для пользователя имя файла.
2. В конфиге nginx при отдаче файла этот параметр подставляется в заголовок Content-Disposition.
(add_header Content-Disposition ‘attachment;Filename=$args’;)
Проблемы начались с подстановкой в Content-Disposition русского текста.
Во-первых, firefox при редиректе на хранилище делает urlencode ссылки. И nginx в Content-Disposition подставляет закодированную строку. Соответственно firefox предлагает сохранить файл также под закодированным именем.
Во-вторых, даже если в Content-Disposition будет незакодированная строка, но в UTF-8 с кириллицей, то IE ничего знать не хочет о том, что это UTF-8. Интерпретирует его как cp1251 и имя файла получается с кракозябрами.
В общем, данная схема нормально работает только в хроме. Если я не ошибаюсь, то с проблемой номер 1 (urlencode) можно справиться, если пересобрать nginx из исходников, включив в него модуль ngx_set_misc. Тогда в конфиге nginx можно будет с помощью set_unescape_uri сделать urldecode для имени файла перед тем как вставлять его в заголовок Content-Disposition. Но к такому варианту хотелось бы прибегать в последнюю очередь.
А как решить проблему с IE — вообще не знаю.
В общем, я в тупике. Был бы очень благодарен за совет, может быть есть гораздо более простой способ решения моей задачи, а я его в упор не вижу.
Оценить 3 комментария