2009-10-04 33 views
10

tôi đang làm việc trên một cách để phục vụ lưu các tập tin MP3 thông qua PHP và sau khi một số hình thức giúp đỡ SO khổng lồ, tôi đã nhận nó làm việc hereThiết lập apache để phục vụ PHP khi một tập tin MP3 được yêu cầu

Tuy nhiên, đó Ví dụ không xuất hiện để làm việc khi tôi sử dụng nó như là nguồn trong một thẻ âm thanh như thế này

<html> 
    <head> 
     <title>Audio Tag Experiment</title> 
    </head> 
    <body> 

    <audio id='audio-element' src="music/mp3.php" autoplay controls> 
    Your browser does not support the audio element. 
    </audio> 

    </body> 
</html> 

và đây là PHP

<?php 

$track = "lilly.mp3"; 

if(file_exists($track)) 
{ 
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"); 
header('Content-length: ' . filesize($track)); 
header('Content-Disposition: filename="lilly.mp3"'); 
header('X-Pad: avoid browser bug'); 
Header('Cache-Control: no-cache'); 

readfile($track); 
}else{ 
    echo "no file"; 
} 

vì vậy, tôi nghĩ (và điều này có thể ar Ý tưởng thực sự tồi tệ, bạn nói với tôi) rằng tôi có thể thiết lập Apache để phục vụ tệp PHP khi ai đó yêu cầu .MP3.

Vì vậy, tôi đã ba câu hỏi

  1. Sẽ làm việc này
  2. Tốt Idea/Bad Idea?
  3. Tôi cần phải làm gì? Sẽ đặt "ứng dụng AddType/x-httpd-php .mp3" int ông httpd conf làm điều đó?

Trả lời

17

Có một số lỗi trong mã của bạn:

  • Một nguồn lực chỉ có thể có một giá trị duy nhất Content-Type. Vì vậy, bạn phải quyết định loại phương tiện nào bạn muốn sử dụng. Tôi đề nghị audio/mpeg.
  • Bạn quên chỉ định bố cục trong Content-Disposition. Nếu bạn chỉ muốn cung cấp tên tệp và không muốn thay đổi bố cục, hãy sử dụng giá trị mặc định inline.

Phần còn lại có vẻ ổn. Nhưng tôi cũng sẽ gửi mã trạng thái 404 nếu không thể tìm thấy tệp.

$track = "lilly.mp3"; 

if (file_exists($track)) { 
    header("Content-Type: audio/mpeg"); 
    header('Content-Length: ' . filesize($track)); 
    header('Content-Disposition: inline; filename="lilly.mp3"'); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    readfile($track); 
    exit; 
} else { 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    echo "no file"; 
} 
+0

Genius! Inline đã làm các trick và tôi đã dọn dẹp Content-Type và bây giờ tôi đang gửi một 404. – gargantuan

4

Bạn có thể chỉ cần tạo nó để bạn có quy tắc mod_rewrite chạy mọi yêu cầu nhạc/*. Mp3 thông qua tệp mp3.php của bạn.

Ví dụ, một cái gì đó giống như

RewriteEngine on 
RewriteRule ^/music/(.*\.mp3) /music/mp3.php?file=$1 [L] 

mp3.php này sau đó có thể lấy các tập tin yêu cầu từ $ _GET [ 'file'], nhưng nếu bạn đi với cách tiếp cận này, tôi khuyên bạn nên tỉnh táo kiểm tra tên tập tin , để đảm bảo nó chỉ tham chiếu đến một tệp trong thư mục mong muốn.

//ensure filename just uses alphanumerics and underscore 
if (preg_match('/^[a-z0-9_]+\.mp3$/i', $_GET['file'])) 
{ 
    //check file exists and serve it 

    $track=$_SERVER['DOCUMENT_ROOT'].'/music/'.$_GET['file']; 
    if(file_exists($track)) 
    { 
     header("Content-Type: audio/mpeg"); 
     header('Content-length: ' . filesize($track)); 
     //insert any other required headers... 

     //send data 
     readfile($track); 
    } 
    else 
    { 
     //filename OK, but just not here 
     header("HTTP/1.0 404 Not Found"); 
    } 

} 
else 
{ 
    //bad request 
    header("HTTP/1.0 400 Forbidden"); 
} 
+0

đó làm việc quá, nhưng câu trả lời khác là ... tinh khiết tôi đoán. Mặc dù điều đó đã nhắc tôi sử dụng .htaccess để ngăn người truy cập trực tiếp vào các tệp. Chúc mừng. – gargantuan

+0

Giải pháp này cho phép bạn có các URL .mp3, nhưng cho phép bạn chặn các yêu cầu đó bằng một số PHP. Nó không phải là những gì bạn muốn, nhưng tôi bắt đầu nó vì vậy tôi đã hoàn thành! –

+0

Nỗ lực tốt. Ai đó ở đâu đó sẽ thấy hữu ích. – gargantuan

0

một này làm việc cho tôi (trong .htaccess):

<FilesMatch "mp3$"> 
    SetHandler application/x-httpd-php5 
</FilesMatch> 
Các vấn đề liên quan