Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Срезание названия скачиваемого файла по пробелу.
Форумы портала PHP.SU » » Вопросы новичков » Срезание названия скачиваемого файла по пробелу.

Страниц (2): [1] 2 »
 

1. Арикус - 31 Января, 2016 - 00:32:45 - перейти к сообщению
Есть ссылка, по которой скачивается файл.
CODE (html):
скопировать код в буфер обмена
  1. <a href="download.php?filename=question/379-тест1/Это Спарта.jpg">Это Спарта.jpg</a>

Полный код download.php:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $filename = $_GET['filename'];
  3.  
  4.  // нужен для Internet Explorer, иначе Content-Disposition игнорируется
  5. if(ini_get('zlib.output_compression'))
  6.   ini_set('zlib.output_compression', 'Off');
  7. $file_extension = strtolower(substr(strrchr($filename,"."),1));
  8. if( $filename == "" )
  9. {
  10.           echo "ОШИБКА: не указано имя файла.";
  11.           exit;
  12. } elseif ( ! file_exists( $filename ) ) // проверяем существует ли указанный файл
  13. {
  14.           echo "ОШИБКА: данного файла не существует.";
  15.           exit;
  16. };
  17. switch( $file_extension )
  18. {
  19.           case "html": $ctype="application/html"; break;
  20.           default: $ctype="application/force-download";
  21. }
  22. header("Pragma: public");
  23. header("Expires: 0");
  24. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  25. header("Cache-Control: private",false); // нужен для некоторых браузеров
  26. header("Content-Type: $ctype");
  27. header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
  28. header("Content-Transfer-Encoding: binary");
  29. header("Content-Length: ".filesize($filename));
  30. readfile("$filename");
  31. exit();
  32. ?>

Файл скачивается, но название файла получается "Спарта.jpg" вместо "Это Спарта.jpg"
Замена в ссылке пробела на плюс
CODE (html):
скопировать код в буфер обмена
  1. <a href="download.php?filename=question/384-тест1/Это+Спарта.jpg">Это Спарта.jpg</a>

приводит к тому же результату
2. Viper - 31 Января, 2016 - 11:50:06 - перейти к сообщению
Пробуйте прописать цифры либо англ. буквами длинное название. Результат увидеть.
не имеет смысла. Для того что вы хотите есть is_file()
3. Арикус - 01 Февраля, 2016 - 14:18:17 - перейти к сообщению
Viper
Английское название с пробелами
CODE (html):
скопировать код в буфер обмена
  1. <a href="download.php?filename=question/384-тест1/This is Sparta.jpg">This is Sparta.jpg</a>

действительно загружается правильно "This is Sparta.jpg".

В длинном названии (максимальной длины, которое позволил виндоус)
CODE (html):
скопировать код в буфер обмена
  1. <a href="download.php?filename=question/384-тест1/123944185486416465465468415246465165419841316549415316548135164161516519191613434984984156416515416545649416546513547864874654864651657489453453743516854845313548643651534864534135438453435453438468348646464534334864834534.jpg">123944185486416465465468415246465165419841316549415316548135164161516519191613434984984156416515416545649416546513547864874654864651657489453453743516854845313548643651534864534135438453435453438468348646464534334864834534.jpg</a>

при загрузке обрезает последние 4 символа, то есть оканчивается на "...483.jpg". Вероятно, это как-то связано с расширением .jpg, в котором тоже 4 символа.
4. Мелкий - 01 Февраля, 2016 - 18:11:22 - перейти к сообщению
Для начала ссылка должна быть в urlencode. Или http_build_query
Во-вторых, заголовок с filename тоже должен в urlencode

В-третьих, приведённый скрипт использовать категорически нельзя. Вы сделали огромную глупость и выставили весь сервер открытым в мир. Может быть прочитан любой файл, на какой у пользователя, от имени которого запущен PHP, хватит прав.
5. Арикус - 02 Февраля, 2016 - 02:38:36 - перейти к сообщению
Мелкий Большое спасибо, что обратили моё внимание на проблему безопасности. Я поставил ограничительное условие: если указан файл не из определённых папок, всплывает ошибка и скрипт не выполняется.
Заворачивание в urlencode
PHP:
скопировать код в буфер обмена
  1. $rFile = '<a href="download.php?filename='.urlencode($uploadFile).'">';

даёт уже упомянутые мной плюсы
CODE (html):
скопировать код в буфер обмена
  1. <a href="download.php?filename=question/384-тест1/Это+Спарта.jpg">Это Спарта.jpg</a>

и никаких результатов не даёт.
Я не понял что ещё вы предлагали завернуть в urlencode.
6. DelphinPRO - 02 Февраля, 2016 - 08:19:20 - перейти к сообщению
Арикус пишет:
Я не понял что ещё вы предлагали завернуть в urlencode.


Мелкий пишет:
Во-вторых, заголовок с filename тоже должен в urlencode


PHP:
скопировать код в буфер обмена
  1. header("Content-Disposition: attachment; filename=\"".urlencode(basename($filename))."\";" );


Ниндзя
7. Арикус - 02 Февраля, 2016 - 14:32:09 - перейти к сообщению
DelphinPRO пишет:

PHP:
скопировать код в буфер обмена
  1. header("Content-Disposition: attachment; filename=\"".urlencode(basename($filename))."\";" );


Результат скачивания: "+Спарта.jpg"
8. DelphinPRO - 02 Февраля, 2016 - 16:19:47 - перейти к сообщению
попробуй rawurlencode() - она пробел кодирует по другому %20
9. Арикус - 02 Февраля, 2016 - 19:40:30 - перейти к сообщению
DelphinPRO
PHP:
скопировать код в буфер обмена
  1. header("Content-Disposition: attachment; filename=\"".rawurlencode(basename($filename))."\";" );

Результат скачивания: "-Спарта.jpg" Улыбка
10. DelphinPRO - 02 Февраля, 2016 - 19:45:50 - перейти к сообщению
Сделал бы давно реплейс пробелов на подчеркивание и не мучался Улыбка
11. Арикус - 02 Февраля, 2016 - 20:55:49 - перейти к сообщению
DelphinPRO пишет:
Сделал бы давно реплейс пробелов на подчеркивание и не мучался Улыбка

Я хочу, чтобы файлы скачивались с теми же названиями, с которыми их загружает пользователь. Но, видимо, для русских названий придётся.
12. rasschitai - 02 Февраля, 2016 - 21:20:39 - перейти к сообщению
где смотрите результат, на локалке, из под винды?
13. DelphinPRO - 02 Февраля, 2016 - 22:00:53 - перейти к сообщению
Арикус пишет:
Но, видимо, для русских названий придётся.

Хотите сказать, что названия на латинице с пробелами отрабатывает нормально?
14. Арикус - 02 Февраля, 2016 - 23:31:19 - перейти к сообщению
rasschitai пишет:
где смотрите результат, на локалке, из под винды?

Нет, скачиваю файл с реального сервера, с линукс на винду.
DelphinPRO пишет:
Хотите сказать, что названия на латинице с пробелами отрабатывает нормально?

Именно, я говорил об этом во втором посте.
15. sympler - 03 Февраля, 2016 - 00:50:00 - перейти к сообщению
Мой работающий код, с пробелами точно работает


$file_rus_name = $file['name'] . ' (v.' . $file['version'] . ').' . $extension;

Header("HTTP/1.1 200 OK");
Header("Connection: close");
Header("Content-Type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Content-Disposition: Attachment; filename=\"{$file_rus_name}\"");
Header("Content-Length: ".filesize($file['file']));
readfile($file['file']);

 

Powered by ExBB FM 1.0 RC1