您可能想知道为什么文件被“放入”数据库中而不仅仅是文件系统中。
在 PHP 应用程序需要存储整个文件的情况下,首选方法是将文件保存到服务器的文件系统并将文件的物理位置存储在数据库中。 这通常被认为是存储文件最简单、最快的方法。
但是,您可能会发现您希望将文件本身与数据库中的其他数据一起保留。 这使您(或者更确切地说:MySQL)可以完全控制文件数据,而不仅仅是文件在服务器上的位置。
然而,这种方法也有一些缺点,例如性能降低以及 PHP 代码和数据库结构的复杂性增加。 在实际应用程序中使用它之前,您应该仔细考虑这一点。
话虽如此,本文演示了如何从浏览器上传文件到 MySQL,以及如何将文件发送回浏览器。
准备
要成功地做到这一点,您应该熟悉以下内容:
作战计划
与所有程序一样,我们需要在开始编写之前提前计划。 这样我们在写之前就知道要写什么。
在开始程序之前,我们需要设计数据库。 这不是一个复杂的设计,因为我们不是在谈论创建一些复杂的文件系统。 我们只需要一个包含文件的 BLOB 字段和各种其他字段的表来存储文件的信息,例如名称、大小、类型。
所以现在。 该程序的第一阶段是将文件从用户处获取到 PHP 可以与之交互的服务器。 这是该过程中最简单的部分,仅需要基本的 HTML 表单。
第二阶段包括读取上传的文件,确保其上传成功并将其添加到数据库中。 这与将文件上传到文件系统时使用的过程类似,但使用 MySQL 函数而不是文件系统函数。
第三阶段是列出所有已上传并保存在数据库中的文件,并提供下载链接。 这里唯一的问题是该文件在服务器上不存在,那么我们如何创建指向它的链接呢? 这是在第 4 阶段处理的,在第 3 阶段我们需要做的就是创建一个链接,其中包含嵌入在 URL 中的要下载的文件的 ID。
第四部分也是最后一部分是该过程中最令人困惑的部分。 我们获取文件并将其发送到客户端浏览器的部分。
我们首先使用 MySQL 函数从数据库获取文件数据以及第 3 阶段发送的 ID。然后我们设置一些标头让浏览器知道期望的内容,最后发送文件的内容。
现在,使用此摘要作为指导,让我们开始编写我们的程序。
第0阶段:构建数据库
数据库很简单。 包含文件数据的 BLOB 字段和与文件相关的各种信息的多个字段的表:
展开||选择|包|行号
表'文件'(
'id' int 不为空,
'name' (255) not null 默认值 '.txt',
'mime' (50) 不为 null 默认 'text/plain',
'size' not null 默认值为0,
“数据”不为空,
'' 不为空,
主键('id')
如您所见,我们存储文件名,包括扩展名。
我们有 mime 类型,我们用它来让浏览器知道我们正在处理什么类型的文件。
文件的大小(以字节为单位)。
最后是位于字段中的数据本身。
第一阶段:上传文件
现在我们需要从用户那里获取文件。 我们正在设计的表单不需要用户提供任何其他信息,因此我们将简化这一过程并创建一个仅包含单个“文件”输入字段和提交按钮的 HTML 表单:
展开||选择|包|行号
html>
MySQL文件上传示例
字符集=UTF-8">
查看所有文件
请注意该元素的第三个属性“”。 这告诉浏览器如何将表单数据发送到服务器。 事实上,发送文件时,必须设置为“/form-data”。
如果以其他方式设置或根本未设置,您的文件可能无法正确传输。
在底部,我们有一个指向我们将在第 3 阶段创建的列表的链接。
第 2 阶段:将文件添加到数据库
在第 1 阶段构建的表单中,我们将属性设置为“.php”。 这是我们将为该过程的此阶段构建的文件。
该文件需要检查文件是否已经上传,确保上传没有错误,并将其添加到数据库中:
展开||选择|包|行号
($['']['姓名']);
$mime = $->($['']['类型']);
$data = $->(($['']['']));
$size = ($['']['size']);
创建 SQL 查询
$查询=“
插入“文件”(
'名称','哑剧','大小','数据',''
价值(
'{$name}'、'{$mime}'、{$size}、'{$data}'、now()
)”;
执行查询
$ = $->查询($查询);
检查是否成功
如果($){
echo "成功!您的文件添加成功!
否则{
回显'错误! 无法插入文件'
”。
{$dbLink->error}
”;
否则{
echo '上传文件时发生错误。 '
。“错误代码:”。 ($['']['错误']);
关闭mysql连接
$->关闭();
否则{
回显'错误! 文件未发送!
echo 链接返回主页
回声'
点击这里返回
';
第 3 阶段:列出所有现有文件
现在我们的数据库中有多个文件,我们需要创建一个文件列表并链接它们以便可以下载它们:
展开||选择|包|行号
查询($sql);
检查是否成功
如果($){
确保那里有一些文件
如果($->==0){
回声'
数据库中没有文件
';
否则{
打印表格顶部
回声'
姓名
哑剧
大小(字节)
已创建
';
打印每个文件
while($row = $->()) {
回声”
{$行['名称']}
{$行['哑剧']}
{$行['大小']}
{$row['已创建']}
下载
”;
关闭表
回声'';
发布结果
$->免费();
返回
回显'错误! SQL 查询失败:';
回声”
{$dbLink->error}
”;
关闭mysql连接
$->关闭();
第四阶段:下载文件
这是通常引起最混乱的部分。
要真正了解其工作原理,您必须了解浏览器如何下载文件。 当浏览器从 HTTP 服务器请求文件时,服务器响应包含有关其内容的信息。 这些信息位称为标头。 标头通常包括有关正在发送的数据类型、响应大小和文件名的信息。
当然还有许多其他的标题,我不会在这里介绍,但值得研究!
现在,这段代码。 我们只需要读取第三阶段链路发送的ID即可。 如果 ID 有效,我们将获取收到的文件 ID 信息,发送标头,最后发送文件数据:
展开||选择|包|行号
== 1) {
获取行
$行=($);
打印标题
("内容类型:".$row['mime']);
("-:".$row['size']);
("-:;=".$row['name']);
打印数据
回显$row['数据'];
否则{
回显'错误! 该 ID 不存在图像。
释放资源
@($);
否则{
echo "错误!查询失败:
{$dbLink->error}
”;
@($);
否则{
回显'错误! 没有通过ID。
任何像样的浏览器都应该能够读取标头并了解这是什么类型的文件,并下载它而不是打开它。
我希望这对您有所帮助并祝您一切顺利。
欢迎关注我,一起讨论、了解前沿科技资讯,提高你的赚钱认知能力。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。