Проблема с файлом чтения PHP

Я использую следующее:

@header("Cache-Control: no-cache, must-revalidate");
@header("Content-Type: application/octet-stream");
@header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
@header("Content-Length: ".$row['file_size']);
@header("Content-Disposition: attachment; filename=\"".$row['artist'] . " - " .$row['title']."\"");
@header("Content-type: audio/mpeg;\r\n");

чтобы начать загрузку, теперь по какой-то причине это дает мне

Предупреждение: readfile (http://theurl.com/downloads/the file some space.mp3) [function.readfile]: не удалось открыть поток: HTTP-запрос не прошел! HTTP / 1.1 404 не найден в /home/belgin/public_html/dl.php в строке 29

Теперь URL-адрес действителен, я трижды проверил, но может ли это быть из-за пробелов в имени файла? И если да, то как я могу это исправить? Спасибо

строка файла:

readfile(http://domain.com/downloads/Warp 1.9_The Bloody Beetroots_320000.mp3)

person Belgin Fish    schedule 29.09.2010    source источник
comment
Покажите строку readfile, и мы покажем вам, как от нее избавиться.   -  person Jason McCreary    schedule 30.09.2010
comment
Помимо, возможно, urlencode () URL-адреса, ваш фрагмент кода не заключает URL-адрес (строку) в кавычки ?!   -  person MrWhite    schedule 30.09.2010
comment
Я не знаю, выглядит ли ваша строка readfile() точно так, как вы ее поместили, потому что здесь отсутствуют кавычки вокруг URL-адреса, и Ашерер прав, что URL-адреса должны быть закодированы, пробелы не допускаются.   -  person Arc    schedule 30.09.2010


Ответы (4)


Я думаю, вам понадобится urlencode () и html_entities () URL-адрес или имя файла или что-то еще

person Ascherer    schedule 29.09.2010
comment
я надеюсь, что это что-то вроде readfile ($ filename), если это так, измените его на этот readfile (html_entities (urlencode ($ filename))); - person Ascherer; 30.09.2010
comment
Это должно быть readfile(urlencode($filename));, а не htmlentities(), что необходимо только для экранирования строк, которые должны использоваться в (X) HTML (в тегах, атрибутах или для отображения). - person Arc; 30.09.2010
comment
теперь я получаю файл для чтения (domain.com/downloads%2FWarp+1.9_The + Bloody + Beetroots_320000.mp3), который не работает (неверный URL и все) - person Belgin Fish; 30.09.2010
comment
хорошо, поэтому вам придется разделить имя файла и URL-адрес файла чтения (domain.com/downloads/.html_entities (urlencode ($ filename))) - person Ascherer; 30.09.2010
comment
Хм ... Думаю, моя ошибка. urlencode() также кодирует http:// часть URL-адреса, которая включает : и /. Вы должны кодировать только часть имени файла. Но опять же нет htmlentities(). - person Arc; 30.09.2010
comment
htmlentities ничего не повредит, на самом деле это делает URL-адреса лучше. + вместо% 20 - person Ascherer; 30.09.2010
comment
urlencode() делает это + (в отличие от rawurlencode(), который генерирует %20). htmlentities() преобразует символы, для которых существуют объекты SGML / HTML, такие как &, в & и т. Д. Единственная причина, по которой это не повредит (помимо дополнительной работы для вашего сервера), заключается в том, что в строках с кодировкой URL не осталось символов, которые можно было бы экранировать. пользователя htmlentities(). - person Arc; 30.09.2010
comment
ну, тогда я ошибаюсь, лол. Я видел, как люди делали то же самое, что и я, и это то, что использовал ive, и это всегда работало для меня, но если вам это не нужно, не используйте это - person Ascherer; 30.09.2010

Кажется, что URL-адрес содержит пробелы. Вы правильно избегаете его для использования внутри readfile ()?

person Vasilis Lourdas    schedule 29.09.2010

НЕ кодируйте URL! Он будет кодироваться как http%3A%2F%2Fexample.com%2Fsome%20song.mp3. Вам просто нужно заменить пробелы. так что используйте вместо этого str_replace ...

readfile(str_replace(" ", "%20", $url));

person Stichoza    schedule 12.05.2012

urlencode () - это не выход. Как упоминалось выше, просто используйте str_replace ().

Еще одна возможность, почему он не работает. Это было причиной для меня. Интересно, что file_exists возвращал истину, но ни одна форма предоставления файла для загрузки не работала без правильной настройки ниже.

В PHP есть параметр под названием open_basedir.

Убедитесь, что это правильно настроено для вашей среды хостинга. open_basedir можно редактировать через php.ini

person 3rdLion    schedule 11.10.2013