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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Арикус
Отправлено: 31 Января, 2016 - 00:32:45
Post Id



Гость


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июнь 2015  
Откуда: Москва, Россия


Помог: 0 раз(а)




Есть ссылка, по которой скачивается файл.
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>

приводит к тому же результату

(Отредактировано автором: 31 Января, 2016 - 00:34:18)

 
 Top
Viper
Отправлено: 31 Января, 2016 - 11:50:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Пробуйте прописать цифры либо англ. буквами длинное название. Результат увидеть.
не имеет смысла. Для того что вы хотите есть is_file()


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Арикус
Отправлено: 01 Февраля, 2016 - 14:18:17
Post Id



Гость


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июнь 2015  
Откуда: Москва, Россия


Помог: 0 раз(а)




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 символа.

(Отредактировано автором: 01 Февраля, 2016 - 14:20:45)

 
 Top
Мелкий Супермодератор
Отправлено: 01 Февраля, 2016 - 18:11:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Для начала ссылка должна быть в urlencode. Или http_build_query
Во-вторых, заголовок с filename тоже должен в urlencode

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


-----
PostgreSQL DBA
 
 Top
Арикус
Отправлено: 02 Февраля, 2016 - 02:38:36
Post Id



Гость


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июнь 2015  
Откуда: Москва, Россия


Помог: 0 раз(а)




Мелкий Большое спасибо, что обратили моё внимание на проблему безопасности. Я поставил ограничительное условие: если указан файл не из определённых папок, всплывает ошибка и скрипт не выполняется.
Заворачивание в 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.
 
 Top
DelphinPRO
Отправлено: 02 Февраля, 2016 - 08:19:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Арикус пишет:
Я не понял что ещё вы предлагали завернуть в urlencode.


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


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


Ниндзя


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Арикус
Отправлено: 02 Февраля, 2016 - 14:32:09
Post Id



Гость


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июнь 2015  
Откуда: Москва, Россия


Помог: 0 раз(а)




DelphinPRO пишет:

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


Результат скачивания: "+Спарта.jpg"

(Отредактировано автором: 02 Февраля, 2016 - 14:32:40)

 
 Top
DelphinPRO
Отправлено: 02 Февраля, 2016 - 16:19:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




попробуй rawurlencode() - она пробел кодирует по другому %20


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Арикус
Отправлено: 02 Февраля, 2016 - 19:40:30
Post Id



Гость


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июнь 2015  
Откуда: Москва, Россия


Помог: 0 раз(а)




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

Результат скачивания: "-Спарта.jpg" Улыбка
 
 Top
DelphinPRO
Отправлено: 02 Февраля, 2016 - 19:45:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Сделал бы давно реплейс пробелов на подчеркивание и не мучался Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Арикус
Отправлено: 02 Февраля, 2016 - 20:55:49
Post Id



Гость


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июнь 2015  
Откуда: Москва, Россия


Помог: 0 раз(а)




DelphinPRO пишет:
Сделал бы давно реплейс пробелов на подчеркивание и не мучался Улыбка

Я хочу, чтобы файлы скачивались с теми же названиями, с которыми их загружает пользователь. Но, видимо, для русских названий придётся.
 
 Top
rasschitai
Отправлено: 02 Февраля, 2016 - 21:20:39
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Февр. 2016  


Помог: 0 раз(а)




где смотрите результат, на локалке, из под винды?
 
 Top
DelphinPRO
Отправлено: 02 Февраля, 2016 - 22:00:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Арикус пишет:
Но, видимо, для русских названий придётся.

Хотите сказать, что названия на латинице с пробелами отрабатывает нормально?

(Отредактировано автором: 02 Февраля, 2016 - 22:01:18)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Арикус
Отправлено: 02 Февраля, 2016 - 23:31:19
Post Id



Гость


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июнь 2015  
Откуда: Москва, Россия


Помог: 0 раз(а)




rasschitai пишет:
где смотрите результат, на локалке, из под винды?

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

Именно, я говорил об этом во втором посте.
 
 Top
sympler
Отправлено: 03 Февраля, 2016 - 00:50:00
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




Мой работающий код, с пробелами точно работает


$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']);
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB