PHP操作MongoDB GridFS 存储文件的详解

yizhihongxing

可以参考以下的完整攻略。

PHP操作MongoDB GridFS 存储文件的详解

什么是MongoDB GridFS

MongoDB GridFS是MongoDB数据库中的一种机制,用于存储大型二进制文件,如图片,音频和视频等文件。GridFS把大文件分成小的块并保存在MongoDB集合中,它使用两个集合来存储文件:fs.filesfs.chunks

  • fs.files集合:保存文件的元数据(metadata),如文件名,大小,上传日期和 MIME类型等。
  • fs.chunks集合:保存文件数据的具体块(chunk),一般每个块的大小为256KB,每个块都有对应的ID和数据。

GridFS还具备以下优点:

  • 支持复制和分片
  • 支持恢复和部分建立索引。
  • 可以从多个不同的MongoDB实例中存储文件(Sharding)

使用PHP操作MongoDB GridFS进行文件存储

首先,需要安装并启用MongoDB PHP驱动程序。可以通过以下命令来安装:

 pecl install mongodb

然后,在PHP中,可以使用官方MongoDB PHP库提供的GridFS类来进行文件存储。

  1. 连接MongoDB数据库
$client = new MongoDB\Client("mongodb://localhost:27017");
$database = $client->mydatabase;
  1. 获取GridFS集合
$gridFSBucket = $database->selectGridFSBucket();
  1. 存储文件
$stream = fopen('/path/to/my/file', 'r');
$gridFSBucket->uploadFromStream('myfile.txt', $stream, [
    'metadata' => ['key' => 'value'],
]);
fclose($stream);

这里的$stream是一个打开的文件流,它的第一个参数是要存储的文件名,第二个参数是文件流。如果需要向文件添加附加的元数据,可以在第三个参数中指定一个元数组。上传完成后,uploadFromStream()方法将返回上传的文件ID。

  1. 获取文件
$stream = $gridFSBucket->openDownloadStreamByName('myfile.txt');
echo stream_get_contents($stream);
fclose($stream);

这里的openDownloadStreamByName()方法将返回一个文件流,它可以读取指定文件的内容。stream_get_contents()函数可以读取整个文件流并返回其内容。需要注意的是,当使用完文件流后,需要关闭流以释放资源。

示例1:上传图片文件

下面的示例展示了如何使用PHP从Web表单中上传图像文件并将其存储在MongoDB GridFS中。

<!DOCTYPE html>
<html>
<head>
    <title>PHP Upload Image to MongoDB GridFS</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data">
        Select image to upload:
        <input type="file" name="fileToUpload" id="fileToUpload">
        <input type="submit" value="Upload Image" name="submit">
    </form>
    <?php
    if (isset($_POST['submit'])) {
        if ($_FILES['fileToUpload']['error'] === UPLOAD_ERR_OK) {
            $tmpName = $_FILES['fileToUpload']['tmp_name'];
            $originalName = basename($_FILES['fileToUpload']['name']);
            $fileExt = pathinfo($originalName, PATHINFO_EXTENSION);
            $newFileName = uniqid() . '.' . $fileExt;

            $client = new MongoDB\Client("mongodb://localhost:27017");
            $database = $client->mydatabase;
            $gridFSBucket = $database->selectGridFSBucket();

            $stream = fopen($tmpName, 'r');
            $gridFSBucket->uploadFromStream($newFileName, $stream, [
                'metadata' => ['filename' => $originalName, 'filetype' => $_FILES['fileToUpload']['type']],
            ]);
            fclose($stream);

            echo '<p>Image uploaded successfully!</p>';
        } else {
            echo '<p>Error uploading image: ' . $_FILES['fileToUpload']['error'] . '</p>';
        }
    }
    ?>
</body>
</html>

这里的表单允许用户上传图像文件,它的处理由PHP文件完成。首先,PHP代码检测文件是否可用并处理文件名,然后使用uploadFromStream()方法将文件上传到MongoDB GridFS中。

示例2:上传视频文件

下面的示例展示了如何使用PHP从Web表单中上传视频文件并将其存储在MongoDB GridFS中。

<!DOCTYPE html>
<html>
<head>
    <title>PHP Upload Video to MongoDB GridFS</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data">
        Select video to upload:
        <input type="file" name="fileToUpload" id="fileToUpload">
        <input type="submit" value="Upload Video" name="submit">
    </form>
    <?php
    if (isset($_POST['submit'])) {
        if ($_FILES['fileToUpload']['error'] === UPLOAD_ERR_OK) {
            $tmpName = $_FILES['fileToUpload']['tmp_name'];
            $originalName = basename($_FILES['fileToUpload']['name']);
            $fileExt = pathinfo($originalName, PATHINFO_EXTENSION);
            $newFileName = uniqid() . '.' . $fileExt;

            $client = new MongoDB\Client("mongodb://localhost:27017");
            $database = $client->mydatabase;
            $gridFSBucket = $database->selectGridFSBucket();

            $stream = fopen($tmpName, 'r');
            $gridFSBucket->uploadFromStream($newFileName, $stream, [
                'metadata' => ['filename' => $originalName, 'filetype' => $_FILES['fileToUpload']['type']],
            ]);
            fclose($stream);

            echo '<p>Video uploaded successfully!</p>';
        } else {
            echo '<p>Error uploading video: ' . $_FILES['fileToUpload']['error'] . '</p>';
        }
    }
    ?>
</body>
</html>

这里的示例与上面的上传图像的示例非常相似,因此不做过多解释。唯一的区别是处理的是视频文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP操作MongoDB GridFS 存储文件的详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • NodeJs中的VM模块详解

    当我们想要在 NodeJs 中执行一段 JavaScript 代码时,可以使用 NodeJs 的 VM(虚拟机)模块。VM 模块可以创建一个新的虚拟机上下文,并在其中执行 JavaScript 代码,从而隔离开当前的上下文环境。 VM模块的使用 引入VM模块 首先,我们需要引入 NodeJs 的 VM 模块: const vm = require(‘vm’)…

    MongoDB 2023年5月16日
    00
  • Yii框架连接mongodb数据库的代码

    Yii框架连接 MongoDB 数据库的代码 在 Yii 框架中,我们可以使用 MongoDB 扩展来连接 MongoDB 数据库。以下是 Yii 框架连接 MongoDB 数据库的代码: 步骤一:安装 MongoDB 扩展 在 Yii 框架中,我们需要先安装 MongoDB 扩展。以下是安装 MongoDB 扩展的命令: composer require …

    MongoDB 2023年5月17日
    00
  • Mongodb启动命令参数中文说明

    下面我详细讲解一下“Mongodb启动命令参数中文说明”的完整攻略。 MongoDB启动命令参数中文说明 在使用MongoDB时,我们常需要在启动命令中加入一些参数,来控制MongoDB的启动和运行。下面是对这些参数进行中文说明的攻略: 基础参数 –bind_ip: 指定MongoDB绑定的IP地址,默认为0.0.0.0; –port: 指定MongoD…

    MongoDB 2023年5月16日
    00
  • MongoDB投影(查询指定的字段)方法详解

    什么是投影 在MongoDB中,投影是一种查询方式,它允许我们从文档中选择一小部分字段,以便返回更少的数据量。这对于减少网络带宽和提高查询效率非常有用。 在查询中,可以通过在find()函数中传递第二个对象参数来实现投影。这个对象参数描述了我们想要返回的字段,以及我们希望它们是如何进行排序的。 如何使用投影 在使用投影时,我们需要指定要返回的字段名,或者使用…

    MongoDB 2023年3月14日
    00
  • java操作mongoDB查询的实例详解

    Java操作MongoDB查询的实例详解 MongoDB 是一种流行的 NoSQL 数据库,它基于文档模型存储数据,并且可以通过多种语言进行数据的查询和操作。Java 是 MongoDB 官方支持的语言之一,通过 Java 编写的代码可以方便地连接和操作 MongoDB 数据库。 本文介绍了如何使用 Java 操作 MongoDB 进行查询的两个实例。本文假…

    MongoDB 2023年5月16日
    00
  • Ubuntu 14.04 更换阿里云源的方法

    下面是Ubuntu 14.04 更换阿里云源的方法的完整攻略。 步骤1 – 备份原来的源列表 首先备份原来的源列表,以防在更换新源之后需要恢复: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 这样你就可以在更换新源列表之后,重新导入老的源列表以前的状态。 步骤2 – 替换源列表 在更换源之前,…

    MongoDB 2023年5月16日
    00
  • Java操作mongodb的模糊查询和精确查询

    下面是Java操作mongodb的模糊查询和精确查询的完整攻略。 1. 精确查询 在Java中,我们可以使用MongoDB的eq操作符进行精确查询。下面是一个示例代码: import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mo…

    MongoDB 2023年5月16日
    00
  • MongoDB使用小结:一些不常见的经验分享

    MongoDB使用小结:一些不常见的经验分享 在MongoDB使用过程中,有一些不常见但十分有用的经验和技巧。本篇文章将分享其中一些经验,帮助读者在使用MongoDB时更加得心应手。 1. 使用projection优化查询返回结果 在MongoDB查询时,我们可以使用projection参数来指定需要返回的字段。比如,我们只需要查询用户的name和age字段…

    MongoDB 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部