我的文件的字符串file_id存储在mongodb的fs集合(GridFs)中。
我需要将文件作为mongoengine FileField存储在文档中,然后将文件返回到端点...以便访问文件的内容,content_type等。
我不确定如何使用GridFs字符串ID创建FileField实例?是否可以从FileField获取content和content_type?
我看过的所有教程都涉及通过将内容写入mongodb来创建FileField,不同之处在于我的内容已经在GridFs中,并且我具有字符串ID。
class Test(Document):
file = FileField()
test = Test()
test.upload.put(image_file, content_type='image/png')
到目前为止,我已经能够使用id创建一个GridFsProxy对象,并且可以使用此ID读取文件。
class Test(Document):
file = FileField()
file_id = StringField() # bb2832e0-2ca4-44bc-8b1b-e01a77003b92
file_proxy = GridFSProxy(Test.file_id)
file_proxy.read() # Gives me the file content
file_proxy.get(file_id).content_type #can return name, length etc.
test = Test()
test.file = file_proxy.read() # in mongodb I see it as an ObjectID
如果我将GridFSProxy的read()结果存储到FileField()中;它以ObjectID的形式存储在MongoDb中,然后当我检索该对象时,似乎无法获取文件的content_type。 我需要content_type,因为这对于我返回文件内容很重要。
我不确定如何仅使用file_id创建FileField,然后在检索文档时使用它。
深入了解使用FileField(和GridFSProxy)将很有帮助。
答案 0 :(得分:0)
FileField基本上只是指向实际网格fs文档(存储在fs.chunks / fs.files中)的引用(ObjectId)。访问content_type应该很简单,您完全不必使用GridFSProxy类,请参见下文:
from mongoengine import *
class Test(Document):
file = FileField()
test = Test()
image_bytes = open("path/to/image.png", "rb")
test.file.put(image_bytes, content_type='image/png', filename='test123.png')
test.save()
Test.objects.as_pymongo() # [{u'_id': ObjectId('5cdac41d992db9bfcaa870df'), u'file': ObjectId('5cdac419992db9bfcaa870dd')}]
t = Test.objects.first()
t.file # <GridFSProxy: 5cdac419992db9bfcaa870dd>
t.file.content_type # 'image/png'
t.file.filename # 'test123.png'
content = t.file.read()