Кирилица и пробелы. В пути до файла

Piombo

Новичок
Добрый день!

Есть локальный сайт. (denver+Joomla, Windows) Хотелось бы скачивать файлы (.docx) с локальных дисков.

Код:
//$file = $_GET['file'];
//$file = ("D:/test/test.docx");
$file = ("D:/тест б/по русски.docx");
  if (ob_get_level()) {
  ob_end_clean();
  }
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename=' . basename($file));
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: ' . filesize($file));
  readfile($file);
exit;
Если путь "русский + пробелы" - то нифига не получается.
$file = ("D:/тест%20б/по%20русски.docx");

Что делать? Спасибо!
 

Piombo

Новичок
Спасибо. Но не работает.

не удается передать кодированный УРЛ
Код:
echo '<a href="download2.php?file=', urlencode("D:/тест б/по русски.docx"), '">urlencode</a>';

download2.php:
Код:
$file = $_GET['file'];
echo urldecode ($file);  // тут я получаю урл в кирилице
echo ("<br/>");
echo ($file); // тут я получаю урл в ТОЖЕ в кирилице - а должен быть кодированный
почему так?
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Потому что (сюрприз!) PHP раскодирует данные в запросе.
 

Piombo

Новичок
да! уже понял :)

Может проблема и не в этом. Глобально, мне был хотелось скачивать .docx файлы со страниц локального сайта (denwer, Windows)

Код:
<a href="download.php?file=D:/тест б/по русски.docx">Русский путь</a> |
<a href="download.php?file=D:/test/test.docx">Eng путь</a> |

download.php:
Код:
$file = $_GET['file'];
  if (ob_get_level()) {
  ob_end_clean();
  }
  header('Content-Description: File Transfer');
  header('Content-Type: text/html; charset=utf-8');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename=' . basename($file));
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: ' . filesize($file));
  readfile($file);
exit;
D:/test/test.docx - скачивается нормально
D:/тест б/по русски.docx - нет - вместо него скачивается файл который содержит следующие ошибки:
Код:
Warning: filesize() [function.filesize]: stat failed for D:/тест б/по русски.docx in X:\home\localhost\www\local\url\download.php on line 16

Warning: Cannot modify header information - headers already sent by (output started at X:\home\localhost\www\local\url\download.php:16) in X:\home\localhost\www\local\url\download.php on line 16

Warning: readfile(D:/тест б/по русски.docx) [function.readfile]: failed to open stream: No such file or directory in X:\home\localhost\www\local\url\download.php on line 17
 

AnrDaemon

Продвинутый новичок
iconv('UTF-8', null, $_GET['file']);
urlencode(iconv(null, 'UTF-8', basename()));
Content-Transfer-Encoding бессмысленен. HTTP изначально 8-bit clear.
 

Piombo

Новичок
о здорово! Спасибо!

Если я вас правильно понял то:
Код:
$file = iconv('UTF-8', null, $_GET['file']);
  if (ob_get_level()) {
  ob_end_clean();
  }
  header('Content-Description: File Transfer');
   header('Content-Type: text/html; charset=utf-8');  
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename=' . urlencode(iconv(null, 'UTF-8', basename($file))));
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: ' . filesize($file));
  readfile($file);
exit;
так файл скачивается и он корректен. но имя у него кодированное получается. :(
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Файлы надо хранить нормально, с уникальными именами на латинице, а не черти как. А отдавая скриптом - подсовывать в заголовки его реальное имя.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Piombo, при чем тут "локальный" или нет. Сайт есть сайт, писать любой из них надо нормально.
 

AnrDaemon

Продвинутый новичок
@Piombo, при чем тут "локальный" или нет. Сайт есть сайт, писать любой из них надо нормально.
Сайт должен нормально работать с уникодом.
Проблема очевидно где-то в кодировках. Только у меня нет веб-сервера на винде и проверить, что там творится, пока не могу.
 

Piombo

Новичок
@AnrDaemon, вы же кодируете имя файла
Код:
  header('Content-Disposition: attachment; filename=' . urlencode(iconv(null, 'UTF-8', basename($file))));
вот он и скачивается с таким именем "%D0%BF%D0%BE+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8.docx"

Если так
Код:
$file = iconv('UTF-8', null, $_GET['file']);
var_dump($file);
то имя файла отображается "����.docx"


если сменить кодировку на windows-1251 (ведь в винде имена файлов наверно в этой кодировке?)
Код:
$file = iconv('windows-1251', null, $_GET['file']);
var_dump($file);
то имя файла корректное.
 
Последнее редактирование:

artoodetoo

великий и ужасный
если сменить кодировку на windows-1251 (ведь в винде имена файлов наверно в этой кодировке?)
хоть ты и ошибаешся, но ход мыслей правильный )))

На уровне файловой системы в винде используется уникод. НО когда ты используешь кириллическое имя файла в скрипте PHP, то там ожидается не-уникодный текст. К пыхе подключены восьмибитные варианты функций и поэтому будет нелишним применить iconv() или ещё чего — только к имени файла перед файловой операцией, а не менять кодировку всего на свете!
 
Сверху