GridFS文件存取异常求助:存入成功却无法读取文件
解决GridFS文件读取NoFile错误及put参数说明
Hey Alex, let's figure out what's going on with your GridFS issue and answer your questions about the put method!
一、为什么读取时出现NoFile错误?
最可能的原因是你传递给dbReadFile的fileID是字符串类型,而fs.get()需要的是ObjectId对象。
你打印出来的5c6bcc8562b3d50742110562是字符串形式的ObjectId,但GridFS的get方法要求传入bson.objectid.ObjectId实例,不是纯字符串。这就导致GridFS找不到匹配的文件。
修复方法:
- 先导入
ObjectId:
from bson.objectid import ObjectId
- 调用
dbReadFile时,把字符串转成ObjectId:
dbReadFile(ObjectId('5c6bcc8562b3d50742110562'))
或者在dbReadFile函数内部自动处理类型转换:
def dbReadFile(fileID): from bson.objectid import ObjectId db = MongoClient().TestDB fs = gridfs.GridFS(db) # 确保fileID是ObjectId类型 if isinstance(fileID, str): fileID = ObjectId(fileID) file = fs.get(fileID) print(file)
另外可以快速排查两个小细节:
- 两次连接的数据库是否完全一致(你代码里都是
TestDB,应该没问题) - 存储和读取时是否使用了相同的GridFS集合前缀(默认是
fs,如果存的时候指定了collection参数,读的时候也要对应)
二、你有没有遗漏存储步骤?
完全没有!你的插入代码是正确的:fs.put(open(..., 'rb'))已经完成了文件的存储操作。能拿到ObjectId且数据库中能看到文件,说明存储流程是正常的,问题出在读取环节的参数类型上。
三、put函数的**kwargs参数说明在哪里找?
在PyMongo(Python的MongoDB驱动)的官方文档里,GridFS.put()方法的kwargs主要用于设置文件的元数据,具体细节如下:
- 基础内置参数:你可以传入
filename(指定文件名)、content_type(文件MIME类型)、chunkSize(分块大小)、_id(自定义文件的ObjectId)等,这些会被存在fs.files集合的对应文档中。 - 自定义元数据:任何额外的kwargs都会作为自定义字段添加到文件的元数据文档里,比如你可以传
author='Alex',之后在fs.files里就能看到这个字段。
举个使用示例:
fileID = fs.put( open('../2_134_1_2_134_022_RTP05.mat_final.csv', 'rb'), filename='final_data.csv', content_type='text/csv', project='data_analysis' )
这样存储后,fs.files中对应的文档会包含filename、contentType、project这些字段。
你可以通过本地查看PyMongo的文档(比如执行pydoc gridfs.GridFS.put命令),或者查看PyMongo官方文档中的GridFS部分,就能找到完整的参数说明。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

