从GridFs file_id或GridFSProxy创建Mongoengine FileField

时间:2019-05-14 03:28:31

标签: python mongodb schema mongoengine

我的文件的字符串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)将很有帮助。

1 个答案:

答案 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()