2013-07-24 4 views
0

У меня есть сценарий, который получает URL-адрес для mp3-трека на основе идентификатора, отправленного через переменную GET в URL-адресе. Затем скрипт загружает этот URL-адрес. Проблема в том, что трек не найден.Файл не найден для загрузки PHP

$url = $row['url']; 
$file_name = $row['track_name'] .' - '. $row['artist_name']; 
$path_parts = pathinfo($url); //get path info 
$base_url = $path_parts['basename']; //only include mp3 track just incase path added in there 
$file_path = '../uploads/' . $base_url; 
if (file_exists($file_path)) { 
    header('Content-Description: File Transfer'); 
header('Content-Type: audio/mpeg'); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"".$file_name."\""); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file_path)); 
ob_clean(); 
    flush(); 
readfile($file_path); 
exit; 
} 

else { 
    echo 'File not found.'; 
    echo '<br/>'; 
echo $file_path; 
} 

Что такое шоу, это примерно так;

File not found. 
../uploads/demo_4.wav 

Я попытался поставить полный URL, как $file_path, так http://localhost/upload/ ..., но то же самое происходит.

Если я ввожу URL-адрес, файл находится там, поэтому я не совсем уверен, что происходит.

+1

Помните, что чтение readfile/filexists - это FILESYSTEM, который может вообще не соответствовать пространству URL. просто потому, что у вас есть 'http: // example.com/download/demo_4.wav', это не значит, что в корневом каталоге вашего сайта будет' download' каталог. –

+0

@MarcB Существует каталог загрузок, с которым я связан. '$ file_path = '../uploads/'. $ Base_url; ' –

+0

Где находится этот скрипт относительно файла? Является ли каталог загрузок на один уровень выше, чем находится этот скрипт? –

ответ

0

Если вы работаете в сценарий за пределами корневой папки, вы хотите использовать относительный путь, попробуйте:

$file_path = './uploads/' . $base_url; 

Если вы запускаете скрипт в корневой папке и просто хотите получить доступ к вложенному , попробуйте:

$file_path = 'uploads/' . $base_url; 
+2

Ведущий '. /' Не нужен. –

+1

@azizpunjani Обновлено, надеюсь, удалить путаницу. Я изначально прочитал его, поскольку он не был в корневой папке, поэтому мой оригинальный '. /'. Спасибо за головы. – JClaspill

+0

JClaspill '. /' Не приведет вас к корню. «.» Означает текущий каталог, '. /' Приведет вас в текущий каталог. '/' приведет вас в корневой каталог .... Вы можете попробовать его в оболочке сделать 'cd. /', и он не приведет вас никуда, сделайте 'cd /' из подкаталога, и он приведет вас к корню. –

2

Если путь на изображении является корневая_папкой/добавление/имени файла, попробуйте следующее

 

    $file_path = $_SERVER["DOCUMENT_ROOT"] . "/uploads/" . filename; 
 

Пункт ответа заключается в следующем: вместо использования относительных путей используйте абсолютный путь к файлу, где все до корневой папки ссылается на $ _SERVER ["DOCUMENT_ROOT"].

Надеюсь, что объяснение понятное и ответ поможет.

+0

+1, хотя это редко работает, но это может сработать для этого – pattyd

+0

Это всегда работает для меня.И если путь несколько не манипулируется, я не вижу причины, почему он не должен работать. –

Смежные вопросы