基于 GridFS的文件上传和下载

本文介绍了如何使用Python与MongoDB的GridFS功能进行大文件的上传和下载,包括连接MongoDB、定义文件操作以及在分片集群环境中配置config服务器。
摘要由CSDN通过智能技术生成

1.利用GridFS完成上传下载,源数据自行定义;

使用python 连接mongoDB

from pymongo import MongoClient
from gridfs import GridFS

# 连接到 MongoDB
# 使用指定的数据库
client = MongoClient('mongodb://localhost:27017/')
db = client['yongjiahui']

# 上传文件到 GridFS
# 参数:
#   file_path:要上传的文件路径
#   filename:文件名
#   content_type:文件内容类型
#   metadata:文件元数据
def upload_file(file_path, filename, content_type, metadata=None):
    fs = GridFS(db)
    with open(file_path, 'rb') as file:
        data = file.read()
        fs.put(data, filename=filename, content_type=content_type, metadata=metadata)
    print(f"文件 '{filename}' 上传成功。")

# 下载文件从 GridFS
# 参数:
#   file_id:文件 ID
#   destination_path:下载目标路径
def download_file(file_id, destination_path):
    fs = GridFS(db)
    file = fs.get(file_id)
    with open(destination_path, 'wb') as destination:
        destination.write(file.read())
    print(f"文件下载至 '{destination_path}'。")

# 示例用法
file_path = r'D:\Applications\scoop\apps\mongodb36\data\pythonGridFS.txt'
uploaded_filename = 'example.txt'
content_type = 'text/plain'
file_metadata = {'owner': 'John Doe', 'description': 'An example file'}

# 上传文件到 GridFS
upload_file(file_path, uploaded_filename, content_type, metadata=file_metadata)

# 下载文件从 GridFS
downloaded_file_id = db.fs.files.find_one({'filename': uploaded_filename})['_id']
download_destination = r'D:\Applications\scoop\apps\mongodb36\data\downloaded_file.txt'  # 修改为实际的文件路径
download_file(downloaded_file_id, download_destination)

GridFS 是 MongoDB 中用于存储大文件的协议,它将大文件分割成多个块(chunk)并存储在两个集合中:fs.files 用于存储文件的元数据,fs.chunks 用于存储文件的实际数据块。下面是你的代码涉及到的 GridFS 操作的一些思路:

上传文件到 GridFS

pythonCopy codedef upload_file(file_path, filename, content_type, metadata=None):
    fs = GridFS(db)
    with open(file_path, 'rb') as file:
        # 将文件以二进制形式上传到 GridFS
        fs.put(file, filename=filename, content_type=content_type, metadata=metadata)
    print(f"文件 '{filename}' 上传成功。")
  1. 连接到 MongoDB: 使用 MongoClient 连接到 MongoDB 数据库。
  2. 指定数据库: 使用连接的数据库客户端 client 获取或创建指定的数据库,这里是 yongjiahui
  3. 上传文件: 使用 GridFS 对象创建一个文件对象并使用 put 方法将文件内容上传到 GridFS。在这个过程中,文件会被分割成多个块并存储在 fs.chunks 集合中,而文件的元数据则存储在 fs.files 集合中。

下载文件从 GridFS

pythonCopy codedef download_file(file_id, destination_path):
    fs = GridFS(db)
    file = fs.get(file_id)
    with open(destination_path, 'wb') as destination:
        # 将文件内容写入目标路径
        destination.write(file.read())
    print(f"文件下载至 '{destination_path}'。")
  1. 连接到 MongoDB: 同样,使用 MongoClient 连接到 MongoDB 数据库。
  2. 指定数据库: 获取或创建指定的数据库,这里仍然是 yongjiahui
  3. 下载文件: 使用 GridFS 对象的 get 方法根据文件的 ID 获取文件对象,然后将文件内容写入指定的目标路径。这里的目标路径是你指定的下载目标路径。

4、按要求完成分片集群操作;

  1. 开启config服务器;

    docker run -d --name yjh1 \
      -v /home/mongodb/mongo-config/config:/etc/mongod \
      --network mongo-net \
      --ip \
      -p 27019:27019 \
      mongo:3.6.13 \
      --configsvr --replSet configReplSet --bind_ip 0.0.0.0 --logappend
    
    rs.initiate({
      _id: "configReplSet",
      configsvr: true,
      members: [
        { _id: 0, host: "yjh1:27019" }
      ]
    })
    
    mongo
    
    rs.initiate({
      _id: "configReplSet",
      configsvr: true,
      members: [
        { _id: 0, host: "yjh1:27019" }
      ]
    })
    
    

_id: “configReplSet”,
configsvr: true,
members: [
{ _id: 0, host: “yjh1:27019” }
]
})



  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask和MongoDB可以一起使用来实现文件的上传和下载。下面是一个简单的示例,演示如何使用Flask和MongoDB上传和下载文件。 首先,安装必要的Python库: ```python pip install Flask pip install pymongo pip install pymongo[srv] pip install gridfs ``` 接下来,导入所需的库: ```python from flask import Flask, request, send_file from pymongo import MongoClient from gridfs import GridFS from bson.objectid import ObjectId import os ``` 然后,连接到MongoDB数据库: ```python client = MongoClient("mongodb://localhost:27017/") db = client["mydatabase"] fs = GridFS(db) ``` 现在,我们可以定义上传文件的路由: ```python @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] filename = file.filename file_id = fs.put(file, filename=filename) return str(file_id) ``` 这个路由将接受POST请求,并从请求中获取上传的文件。然后,它将使用GridFS将文件保存到MongoDB,并返回文件的Object ID。 接下来,我们可以定义下载文件的路由: ```python @app.route('/download/<file_id>') def download(file_id): file = fs.get(ObjectId(file_id)) return send_file(file, attachment_filename=file.filename) ``` 这个路由将接受带有文件ID的GET请求,并使用GridFSMongoDB获取文件。然后,它将使用Flask的send_file函数将文件作为响应发送回客户端。 最后,我们可以运行Flask应用程序: ```python if __name__ == '__main__': app.run(debug=True) ``` 完整的代码如下所示: ```python from flask import Flask, request, send_file from pymongo import MongoClient from gridfs import GridFS from bson.objectid import ObjectId import os app = Flask(__name__) client = MongoClient("mongodb://localhost:27017/") db = client["mydatabase"] fs = GridFS(db) @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] filename = file.filename file_id = fs.put(file, filename=filename) return str(file_id) @app.route('/download/<file_id>') def download(file_id): file = fs.get(ObjectId(file_id)) return send_file(file, attachment_filename=file.filename) if __name__ == '__main__': app.run(debug=True) ``` 使用这个示例,您可以上传和下载文件。要上传文件,请向/upload路由发送POST请求,并在请求中包含文件。要下载文件,请向/download/<file_id>路由发送GET请求,其中<file_id>是文件的Object ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值