[英]Query an audio file from my database to PHP
我將mp3
文件上傳到了數據庫。 我用id
列和file
列制作了一個表。 我使用phpMyAdmin將mp3
文件作為LONGBLOB
上傳到了file
列中。
CREATE TABLE voices
(
id int(5),
file longblob
);
如何在HTML音頻標簽中檢索它? 我知道我應該添加更多列以為上傳的文件提供更多信息,但這就像一個測試。
您可以提供base64編碼的多媒體數據作為內聯內容:
<audio controls src="data:audio/mp3;base64,T2dnUwACAAAAAAAAAAA+..........+fm5nB6slBlZ3Fcha363d5ut7u3ni1rLoPf728l3KcK" />
使用一個小的輔助函數,它很容易集成到您的html輸出中:
function getEmbeddedAudioSrc($type, $data) {
return 'data:audio/' . $type . ';base64,' . base64_encode($data);
}
echo '<audio controls src="' . getEmbeddedAudioSrc('mp3', $row['file']) . '">';
通常應將這種方法的使用限制為相當小的音頻文件。 在任何其他情況下,最好將音頻文件寫入光盤,而只需使用普通網址作為參考即可。
將MP3或圖像上載到數據庫通常被認為是一個壞主意,除非這些數據庫是專門設計用於提供這種類型的內容的,或者您有非常明確的理由。
話雖如此,您實際上可以通過序列化MP3來將諸如MP3之類的內容上載到數據庫的BLOB字段中,但是您將拉伸MySQL並造成不必要的延遲,以便將內容移入和移出數據庫以提供內容。
相反,您可以做的是使用數據庫作為指向實際內容的指針 。 現在,其架構實際上取決於您將要運行的規模。 我會根據您的規模給您一些想法:
1.(非常)低流量
如果您不希望流量過多,並且您的應用程序在單個Web服務器上運行,則可以將內容上傳到Web服務器可以讀取並從中提供內容的文件夾中。 那甚至可能在您的應用程序目錄中:
app_folder / media / mp3 / your.mp3
然后可以從HTML5中投放:
<source src="http://your_app_domain/media/mp3/your.mp3" type='audio/mp3' />
在這種情況下,您只需要將MP3文件上傳到media / mp3 /文件夾中,然后將MP3的文件名your.mp3或整個路徑media / mp3 / your.mp3存儲在數據庫中即可,這取決於您的應用程序是否需要邏輯來構建文件的完整路徑,或者將它們都放在同一位置。
2.流量適中
如果流量適中,則問題大致相同,但需要注意的是,您可能不會從單個Web服務器上運行應用程序。 實際上,這意味着,如果允許MP3內容上載然后提供,則需要立即將其提供給所有Web服務器,即使不是即時提供。
快速簡便的方法是將文件存儲到某種SAN中 ,這將使您可以將文件存儲在網絡共享磁盤中,從而使該共享磁盤立即可用於所有Web服務器。 但是如今,這種解決方案感覺有點“自己動手”,並且趨勢是看到越來越多的架構將雲用於靜態內容存儲。
這使我進入下一個選擇,那就是將MP3存儲在Amazon S3或類似產品中。 為此,您需要使用AmazonSDK將內容上傳到S3存儲桶。 它與文件系統幾乎一樣,因此在數據庫中,您仍然需要存儲文件名或存儲它的整個路徑。 然后,要在音頻控件中使用它,您需要構建將S3存儲桶URL與數據庫存儲路徑連接起來的URL:
<source src="https://mybucket.s3-eu-west-1.amazonaws.com/path/to.mp3" type='audio/mp3' />
3.交通繁忙
最后,如果您的流量很大,最好的建議是將資產放在CDN后面。 該解決方案與流量適中的解決方案幾乎相同,但是緩存MP3可以節省大量數據庫查詢,以檢索MP3的位置,還可以使您的網站更快地提供內容,因為CDN可以傳遞內容從您用戶所在位置附近的數據中心訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.