php下載flv檔案或mp4檔案無法播放
想透過POST傳輸flv播放位址或mp4播放位址然後直接下載,下載很容易,直接接收POST資料,POST過來的資料格式類似:http://a .com/1.flv,然後透過PHP下載,測試了兩種方法(只貼出來了用於下載的簡化程式碼):
<?php $url = implode($_POST); $file = file_get_contents($yes); header("Content-Disposition:attachment;filename=1.flv"); echo $file; ?>
或:
<?php $url = implode($_POST); header("Content-type:video/mpeg4"); header("Content-Disposition:attachment;filename=1.flv"); readfile($url); exit; ?>
然後成功下載1.flv文件,但是下載後不可以播放,使用linux直接wget http://a.com/1.flv下載的就可以播放。透過PHP直接下載的開啟就會出現錯誤:
對比檔案大小發現不可以播放的多了3個位元組:
然後vim編輯發現檔案開頭確實多了3個位元組,但是不知道怎麼多的,刪除這3個字節就可以播放:
網上找了找找不到答案,一點這方面的東西也找不到。 。實在不知道哪裡的問題了,大神幫忙解答一下吧= =
解決方法:
這三個字符,是傳說中的BOM啊
說明你用於下載的php文件,格式為UTF-php文件,格式為UTF-php文件,格式為UTF-php 8 with BOM,用Notepad++看一下呢,
或把你所有的php檔案讀出來,然後移除一下?
/** * 移除字符串的BOM * * @param string $str 输入字符串 * @return string 输出字符串 */ function removeBOM($str) { $str_2 = substr($str, 0, 2); $str_3 = substr($str, 0, 3);//$str_2.$str{2}; $str_4 = substr($str, 0, 4);//$str_3.$str{3}; if ($str_3 == pack('CCC',0xef,0xbb,0xbf)) //utf-8 return substr($str, 3); elseif ($str_2 == pack('CC',0xfe,0xff) || $str_2 == pack('CC',0xff,0xfe)) //unicode return substr($str, 2); elseif ($str_4 == pack('CCCC',0x00,0x00,0xfe,0xff) || $str_4 == pack('CCCC',0xff,0xfe,0x00,0x00)) //utf-32 return substr($str, 4); return $str; }
相關文章: