最近苦恼于如何将PDF文件存储进入数据库中,一开始决定将pdf存入mysql中,但找了很久的文档都找不到,都只是将pdf的路径写入进数据库中不是我想要的,其他写法普遍较为困难实现起来有点复杂,最终找到mongodb里面的GridFs这个用来规范存储pdf文件进入数据库
第一步先连接你的本地数据库地址

from  gridfs import  GridFS
from pymongo import MongoClient
client= MongoClient('mongodb://localhost:27017/')

第二部连接你的数据库,然后你要用Navicat里面的gridfs新建一个储存桶,再用GridFS的方法去连接你的组名,如果Gridfs里面没有你写的存储桶的名字他会自动创建包括数据库也是一样,如果没有会自动创建一个。

db = client['你的数据库']
gfs = GridFS(db,collection="你的组名")

在这里插入图片描述
第三部分,找到你的本地文件路径要绝对路径,然后写入

file = open("本地地址:test.pdf","rb")
#更改内容类型为PDF
args = {"content_type":"PDF"}
#输入文件名
gfs.put(file,filename="test.pdf",**args)
#关闭文件
file.close()

在这里插入图片描述
第四部分我们已经将我们的数据库写入进去那么我们现在就需要查询我们的数据库看看里面有没有我们想要的

pdf = gfs.find_one({"filename":"test.pdf"})
# 查询文件名
print(pdf.filename)
#查询文件类型
print(pdf.content_type)
#查询存入的id
print(pdf._id)

然后我们就可以查询到文件名、ID、文件类型
在这里插入图片描述
下面是完整代码

from  gridfs import  GridFS
from pymongo import MongoClient
client= MongoClient('mongodb://localhost:27017/')
db = client['你的数据库']
gfs = GridFS(db,collection="你的组名")
file = open("本地地址:test.pdf","rb")
args = {"content_type":"PDF"}
gfs.put(file,filename="test.pdf",**args)
file.close()
pdf = gfs.find_one({"filename":"test.pdf"})
# 查询文件名
print(pdf.filename)
#查询文件类型
print(pdf.content_type)
#查询存入的id
print(pdf._id)


使用mongoengine来执行数据库插入pdf文件

from mongoengine import connect
from mongoengine import Document, StringField, FileField
db = connect('你的数据库名', host='localhost', port=27017)

# 此处继承的是 mongoengine.Document
class test(Document):
    e1 = StringField()
    e2 = StringField()
    e3 = FileField()
table = test(e1='name', e2='dae')
url = open('文件地址.pdf', 'rb')
table.e3.put(e3, name='要插入的文件地址.pdf')
table.save()

在这里插入图片描述

但是这个插入有个问题就是由filefield文件自动创建了文件名字然后会出现储存库那边出现一个fs文件,但是这个fs文件是无法点击需要继续
出现这个方法的解决方式首先第一步就是将
table.e3.put(e3, name=‘要插入的文件地址.pdf’)这一段代码中插入gridfs默认的文件类型filename,还有更改文件的mime类型也就是contentType
因为GridFS使用两个集合(collection)存储文件
chunks, 用于存储文件内容的二进制数据;
files,用于存储文件的元数据。
而我们这次使用的是files所以是以下这种类型

{  
"_id" :
"filename" : 
"length" :
"chunkSize" :
"uploadDate" : 
"md5" : 
"contentType" : 
"meta" : 
} 

各种文件的mime类型
整理后我们得到

table.e3.put(e3, filename='要插入的文件地址.pdf',contentType='application/pdf')

在这里插入图片描述
然后我们就可以在Navicat中点击这个文件了
如果想要把刚才存入的文件从MongoDB里面提取出来可以参考这篇文章
Python操作mongo–GridFS把图片从mongo中提取出来到本地

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐