可以参考以下的完整攻略。
PHP操作MongoDB GridFS 存储文件的详解
什么是MongoDB GridFS
MongoDB GridFS是MongoDB数据库中的一种机制,用于存储大型二进制文件,如图片,音频和视频等文件。GridFS把大文件分成小的块并保存在MongoDB集合中,它使用两个集合来存储文件:fs.files
和fs.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类来进行文件存储。
- 连接MongoDB数据库
$client = new MongoDB\Client("mongodb://localhost:27017");
$database = $client->mydatabase;
- 获取GridFS集合
$gridFSBucket = $database->selectGridFSBucket();
- 存储文件
$stream = fopen('/path/to/my/file', 'r');
$gridFSBucket->uploadFromStream('myfile.txt', $stream, [
'metadata' => ['key' => 'value'],
]);
fclose($stream);
这里的$stream
是一个打开的文件流,它的第一个参数是要存储的文件名,第二个参数是文件流。如果需要向文件添加附加的元数据,可以在第三个参数中指定一个元数组。上传完成后,uploadFromStream()
方法将返回上传的文件ID。
- 获取文件
$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技术站