MozTW 討論區
https://forum.moztw.org/

我解決了背景音樂問題 但是又引發出新問題= =
https://forum.moztw.org/viewtopic.php?f=13&t=7278
1 頁 (共 1 頁)

發表人:  sdcgf [ 2005-03-25, 22:10 ]
文章主題 :  我解決了背景音樂問題 但是又引發出新問題= =

我用JavaScript寫了一個小程式
如果瀏覽者是使用ie瀏覽器的話
就執行
<object classid="CLSID:05589FA1-C356-11CE-BF01-00AA0055595A" data="[_db_name__].mp3" style="height:40px;width:200px;">
<param name="src" value="[__db_name__].mp3" valuetype="ref" />
<param name="autoStart" value="0" valuetype="data" />
<param name="DisplaySize" value="0" valuetype="data" />
<param name="Volume" value="100" valuetype="data" />
</object>

若不是ie 則執行
<object data="[__db_name__].mp3" type="audio/mpeg" style="height:40px;width:200px;">
<param name="src" value="[__db_name__].mp3" valuetype="ref" />
<param name="autoStart" value="1" valuetype="data" />
<param name="DisplaySize" value="0" valuetype="data" />
<param name="Volume" value="100" valuetype="data" />
</object>

後來為了防止盜連
所以我用php寫了一個防止外連的程式
把[__db_name__].mp3都改成
music.php?id=[__db_name__].mp3

卻發現改成這樣之後 ie可執行
Mozilla Firefox不行 (Orz)

請問有人知道問題出在哪嬤?
謝謝

發表人:  李某人 [ 2005-03-25, 22:30 ]
文章主題 : 

MIME type沒設好罷...

發表人:  sdcgf [ 2005-03-26, 22:08 ]
文章主題 : 

不好意思
不曉得您指的是我程式裡面寫的MIME type
還是我Mozilla Firefox裡面的MIME type設定?

發表人:  BobChao [ 2005-03-26, 23:14 ]
文章主題 : 

sdcgf 寫:
所以我用php寫了一個防止外連的程式
把[__db_name__].mp3都改成
music.php?id=[__db_name__].mp3

只是問一下:你的 __db_name__ 裡應該不包括中文名稱對吧 :)

發表人:  李某人 [ 2005-03-27, 01:38 ]
文章主題 : 

雖然不知道你防止盜連的"程式"的內容是什麼, 但既然能以這種方法使用的話, 相信是Redirect之類的...
我所指就是在PHP裡發出正確的MIME type...

當然我都是猜的...

發表人:  sdcgf [ 2005-03-27, 12:52 ]
文章主題 : 

BobChao 寫:
sdcgf 寫:
所以我用php寫了一個防止外連的程式
把[__db_name__].mp3都改成
music.php?id=[__db_name__].mp3

只是問一下:你的 __db_name__ 裡應該不包括中文名稱對吧 :)


全都用英文命名
[__db_name__]是樣版裡歌曲名稱的變數




李某人 寫:
雖然不知道你防止盜連的"程式"的內容是什麼, 但既然能以這種方法使用的話, 相信是Redirect之類的...
我所指就是在PHP裡發出正確的MIME type...

當然我都是猜的...


if(!file_exists($file_dir.$file_id.$file_key)){exit($_GET[id]."找不到");}
else{$file=fopen($file_dir.$file_id.$file_key,"r");
Header("Content-type:audio/mpeg");
Header("Content-Disposition:attachment;filename=".$file_id.$file_key);
while(!feof($file)){echo fread($file,50000);}fclose($file);}

這是PHP裡面的部分程式
MIME type與樣板裡面呼叫撥放器的MIME type一樣

在不使用這個PHP的防止盜連程式之前 Mozilla Firefox與Internet Explorer都可運行

使用後 則只剩下Internet Explorer可以

另外 不使用撥放器 直接在網址裡面輸入音樂檔案路徑
(如music.php?id=AAAAA.mp3)
則確定可以找的到AAAAA.mp3 下載且撥放
因此可以確定程式是找的到音樂的= =

發表人:  BobChao [ 2005-03-29, 01:26 ]
文章主題 : 

喔天啊我終於解開這個謎了,真令人感動... 由於缺乏對其他 HTTP header 的瞭解和在網路上放音樂的經驗,著實吃了點苦頭 =.=

簡言之: 不要用 Content-Disposition: attachment 的方法送檔案,然後也順便送出 Content-Length 就行了。

代碼:
$file=fopen("after_17.mp3","r");
header("Content-Type: audio/mpeg");
header("Content-Length: ".filesize("after_17.mp3"));
while(!feof($file)){echo fread($file,50000);}fclose($file);


----

以下是「遊記」,由於自以為蠻有趣就寫一下,沒興趣的看剛剛那段瞭解作法就好了..

----

由於我記得以前曾以送出「Content-Disposition: attachment; filename=something.pdf」的方式製作「下載 PDF 檔」的連結(使用者按下此連結後不會在瀏覽視窗中開啟 Acrobat Reader),或許問題就在那裡?所以做了這個測試。

1. 直接從位址列輸入網址,測試瀏覽器怎麼處理。

* Firefox: 以 plugin 開啟
* IE: 以 plugin 開啟

2. 撰寫與提問中相似的 PHP 程式碼,測試瀏覽器怎麼處理。

* Firefox: 下載檔案
* IE: 下載檔案

3. 以 LiveHTTPHeader 查閱直接輸入檔名與間接透過 PHP 接收檔案的差異。以下以加號代表「間接方式有」但「直接方式沒有」的項目,減號代表「直接方式有」但「間接方式沒有」的項目。

- Etag: "1c9d-285000-ca78dee4"
- Accept-Ranges: bytes
- Content-Length: 2641920
+ X-Powered-By: PHP/4.3.3
+ content-disposition: attachment; filename=after_17.mp3
+ Transfer-Encoding: chunked

經此研究獲得的結論如下:
* 不管是哪種方式,以輸入網址方法操作的話兩種瀏覽器處理方式都一樣。
* 兩種方式的 HTTP header 有不少差異

獲得假設:
* 可能是瀏覽器把接收到的檔案轉交給 plugin 的方式不同?
* 如果想辦法把兩種 header 都做到一樣,或許就可以了?

第一個假設如果成立的話,我們是鐵定無能為力的 XD

為了測試第二個假設,決定不用 attachment 作法傳檔案,直接把傳出去的東西當成音樂檔(ㄟ... 這樣講有點奇怪,反正就是不把他當成「網頁的 attachment」XD )。

哇,可以播了耶!不過沒送 Content-Length 會中斷,所以補上就 ok 了...

----
都說了我只是自以為有趣...

發表人:  sdcgf [ 2005-03-29, 09:05 ]
文章主題 : 

BobChao 寫:
----

以下是「遊記」,由於自以為蠻有趣就寫一下,沒興趣的看剛剛那段瞭解作法就好了..

----


老實說 遊記有很多我看不懂的地方 Orz
但是確實可執行了
感謝BobChao兄的幫忙
您的這一步 相信將會是網頁編寫者的一大步(哈)

1 頁 (共 1 頁) 所有顯示的時間為 UTC + 8 小時
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/