2010-03-01 18 views
9

मेरे पास उस व्यक्ति के लिए एक समान स्थिति है जिसने पूछा: Can I serve MP3 files with PHP? असल में मैं एमपी 3 फ़ाइलों को सीधे डाउनलोड से बचाने की कोशिश कर रहा हूं, इसलिए उपयोगकर्ताओं को पहले प्रमाणित करने के लिए PHP के माध्यम से जाना होगा।PHP स्ट्रीमिंग एमपी 3

header('Content-type: audio/mpeg'); 
header('Content-length: ' . filesize($file)); 
header('X-Pad: avoid browser bug'); 
Header('Cache-Control: no-cache'); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"); 
readfile($file); 

यहाँ मेरी समस्या है: - क्विकटाइम में सोचने के लिए फ़ाइल की लंबाई केवल है लगता है फ़ाइल केवल (ब्राउज़र में क्विकटाइम के माध्यम से) शुरुआत का एक बहुत छोटा हिस्सा निभाता है और फिर बंद हो जाता है यहाँ मेरी कोड है जब तक यह हिस्सा डाउनलोड करने में कामयाब रहा। जब मैं पुनः लोड करता हूं - यह थोड़ा बड़ा हिस्सा बजाता है - जो भी उस बिंदु तक डाउनलोड करने में कामयाब रहा।

क्या वह हेडर में समस्या है जो मैं भेज रहा हूं? मैं ऐसी फाइल कैसे स्ट्रीम करूं? क्या यह समस्या है यदि कोई फ़ाइल उस फ़ाइल से पढ़ रही है?

धन्यवाद!


सभी उत्तरों के लिए धन्यवाद दोस्तों। हालांकि इनमें से कोई भी चीज वास्तव में समस्या का समाधान नहीं करती थी, उनमें से कई ने मुझे सही दिशा में भेजा था। बहुत सराहना की। पूर्ण समाधान के लिए यदि आपके सर्वर अपाचे या lighty पर चल रहा है नीचे

+0

मुझे लगता है कि आपके पास अपने वास्तविक कोड में टाइपो ("हेडर") नहीं है? इसके अलावा, आपको एक्स-पैड हैक की आवश्यकता नहीं है। यह केवल प्राचीन नेटस्केप के लिए जरूरी है (http://george.hotelling.net/90percent/geekery/why_is_apache_sending_a_xpad_header.php देखें)। आपको सामग्री-स्थानांतरण-एन्कोडिंग की आवश्यकता नहीं है, और आपको केवल एक बार सामग्री-प्रकार निर्दिष्ट करना चाहिए (ऑडियो/एमपीईजी ठीक है)। –

+0

@ मैथ्यू फ्लैस्चेन: PHP फ़ंक्शन केस-असंवेदनशील हैं, इसलिए यह केवल एक स्थिरता समस्या है। सामग्री-प्रकार यहां वास्तविक समस्या हो सकती है। – Piskvor

उत्तर

6

यहां चाल क्या है।

$dir = dirname($_SERVER['DOCUMENT_ROOT'])."/protected_content"; 
$filename = $_GET['file']; 
$file = $dir."/".$filename; 

$extension = "mp3"; 
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"; 

if(file_exists($file)){ 
    header('Content-type: {$mime_type}'); 
    header('Content-length: ' . filesize($file)); 
    header('Content-Disposition: filename="' . $filename); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    readfile($file); 
}else{ 
    header("HTTP/1.0 404 Not Found"); 
} 
+1

आप इसे पढ़ने से पहले $ _GET ['file'] पर कुछ सत्यापन/sanitizing करना चाह सकते हैं ... – Simon

+0

मैं जांचता हूं कि फ़ाइल मौजूद है अगर (file_exists ($ file)) {'... क्या आपका मतलब है ? –

+4

नहीं, उसका मतलब यह नहीं था। अपने लिए सोचें, क्या होता है अगर कोई इस http://yoursite.com/yourscript.php?file=../../../home/someonesgirlfriend/secretdiary.doc – Jonny

1

मेरा उत्तर देखते हैं, मैं सुझाव है कि आप एक्स Sendfile पर गौर

http://tn123.ath.cx/mod_xsendfile/

यह आप में प्रमाणीकरण संभाल करने की अनुमति देता है आपके PHP आवेदन, लेकिन चलिए आपके वेबसर्वर फ़ाइल के संचरण को संभालते हैं। आपके द्वारा प्राप्त प्रदर्शन सुधार एक अच्छा अतिरिक्त लाभ होना चाहिए

1

आप HTTP chunking आज़मा सकते हैं। "स्थानांतरण-एन्कोडिंग" हेडर को "खंडित" पर सेट करें, फिर इसे भेजने से पहले प्रत्येक खंड के आकार को आउटपुट करें। एक सीआरएलएफ के साथ प्रत्येक खंड आकार और खंड समाप्त करें।

कुछ और जटिल के लिए, मैं एक स्ट्रीमिंग सर्वर का उपयोग करने की सलाह देता हूं, जैसे Icecast

1

दो बातें बाहर खड़े:

  1. आप एक Content-Length सेट मिल गया है। यदि आप सर्वर को अपने आउटपुट को स्वचालित रूप से gzip करने के लिए सेट है, तो यह चीजों के साथ गड़बड़ कर सकता है। Content-Length को बंद करने का प्रयास करें और देखें कि क्या यह ठीक करता है।
  2. आपके पास लगभग एक हजार Content-Type सेट है। चूंकि यह एमपी 3 है कि आप सेवा कर रहे हैं, बस audio/mpeg का उपयोग करें। आप प्रभावी रूप से पूरे अंतिम header() कमांड से छुटकारा पा सकते हैं। HTTP हेडर के साथ ले जाना आसान है।

इसे आज़माएं और हमें बताएं कि यह कैसा चल रहा है!

0

header("Content-Transfer-Encoding: binary"); हटाएं और आप सेट हो जाएंगे!

0

इन समाधान आप भी अपाचे (mod_xsendfile) में xsendfile विन्यस्त करने की जरूरत के लिए या nginx HttpSecureLinkModule - वे आप सटीक एमपी 3 दे देंगे, तो ब्राउज़र इसे सही ढंग से

0

खेलेंगे इन सभी समाधान है, जो छिपाने के लिए मान्य हैं लागू करना मूल पथ और फ़ाइल नाम, दुर्भाग्य से अनधिकृत डाउनलोड से नहीं रोका जाता है। वास्तव में ग्राहक (मेरे मामले पर: क्रोम) फ़ाइल डाउनलोड करता है।

यहाँ लाइनों मैं अपने सर्वर पर डाल दिया: के साथ या बिना लाइन

<?php 
$dir = dirname($_SERVER['DOCUMENT_ROOT'])."/mp3"; 
$filename = $_GET['file']; 
$file = $dir."/".$filename; 

$extension = "mp3"; 
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"; 

if(file_exists($file)){ 
    header('Content-type: {$mime_type}'); 
    header('Content-length: ' . filesize($file)); 
    header("Content-Transfer-Encoding: binary"); 
    header('Content-Disposition: filename="' . $filename); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    readfile($file); 
}else{ 
    header("HTTP/1.0 404 Not Found"); 
} 
?> 

header("Content-Transfer-Encoding: binary"); 

अंतिम परिणाम परिवर्तन नहीं करता है निर्देशिका/एमपी 3

में स्थित है
/home/myuser/ 

(इस प्रकार/घर/माइयूसर/एमपी 3) और सार्वजनिक HTML निर्देशिका

/home/myuser/public_html 

इस प्रकार मेरे डोमेन बुला और

/player.php?file=music.mp3 

यह एक फ़ाइल सभी मूल सामग्री के साथ music.mp3 बुलाया डाउनलोड करता है दे रही है।

संबंधित मुद्दे