簡體   English   中英

從我的數據庫查詢音頻文件到PHP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM