从我的数据库查询一个音频文件到 PHP

Query an audio file from my database to PHP

我上传了 mp3 文件到我的数据库。我用 id 列和 file 列制作了 table。我使用 phpMyAdmin 将 file 列中的 mp3 文件上传为 LONGBLOB

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']) . '">';

这种方法的使用通常应限于相当小的音频文件。在任何其他情况下,最好将音频文件写入光盘并简单地使用普通 url 作为参考。

将 MP3 或图像上传到数据库通常被认为是一个坏主意,除非这些数据库专门设计用于提供此类内容,或者您​​有非常具体(且充分)的理由这样做。

话虽如此,您确实可以通过序列化 MP3 将 MP3 等内容上传到数据库的 BLOB 字段中,但是您会拉伸 MySQL 并导致不必要的延迟将内容移入和移出数据库提供内容。

您可以改为使用您的数据库作为 指针 指向实际内容所在的位置。现在,此架构实际上取决于您将要运营的规模。我会根据这个规模给你一些想法:

1. (非常)低流量

如果您不希望有太多流量,并且您的应用程序 运行 在单个网络服务器中,您可以将内容上传到您的网络服务器具有读取权限的文件夹中并提供服务那里的内容。那甚至可以在您的应用程序目录中:

app_folder/media/mp3/你的.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 服务器一次。但是这个解决方案现在感觉有点"DIY",趋势是看到越来越多的架构使用云来进行静态内容存储。

这让我想到了下一个选项,即将您的 MP3 存储在 Amazon S3 or similar. For doing that, you'd need to use the AmazonSDK 中以将内容上传到 S3 存储桶中。它与文件系统非常相似,因此在您的数据库中,您仍然需要存储文件名或存储它的整个路径。然后要在您的音频控件中使用它,您需要构建 URL 加入 S3 Bucket URL 和您的数据库存储路径:

<source src="https://mybucket.s3-eu-west-1.amazonaws.com/path/to.mp3" type='audio/mp3' />

3。交通拥堵

最后,如果您的流量很大,最好的建议是将您的资产放在 CDN 后面。该解决方案与中等流量的解决方案几乎相同,但缓存您的 MP3 将为您节省大量数据库查询以检索您的 MP3 所在的位置,并且还可以让您的网站更快地提供内容,因为 CDN 可以传送内容来自靠近用户所在位置的数据中心。