Как получить PDF / изображение из справочного поля, используя MongoEngine? - PullRequest
1 голос
/ 11 марта 2020

Я обнаружил некоторые трудности при получении файла PDF / изображения, на который ссылается класс, используя flask из mongodb. Например, у меня есть эта модель:

class Users(db.Document):
    _id = db.StringField()
    name = db.StringField()
    picture = db.ReferenceField('fs.files')
    email = db.StringField()
    password = db.StringField()
    meta = {'collection': 'Users'}

JSON для записи в таблице Users будет выглядеть так:

{
    "_id": "1", 
    "name": "John Doe", 
    "picture": {
        "$ref": "fs.files", 
        "$id": {
            "$oid": "5e1...a932"
         }
     }, 
     "email":"john.doe@example.come", 
     "password": "12345"
}

Использование этой модели в Flask API успокоительного, я пытаюсь получить изображение, связанное с пользователем, для отображения в моем приложении. Кроме того, когда добавляется новый пользователь, как мне сохранить файл со ссылкой в ​​таблице User? Ссылка на изображение сохраняется в поле изображения. Я также хочу сделать это для PDF-файлов таким же образом.

Я пытался посмотреть на GridFS, но я не совсем понимаю, как он работает или как реализовать его в моем flask API с mongoengine. Спасибо.

1 Ответ

0 голосов
/ 11 марта 2020

Вы можете использовать расширение send_file из Flask, чтобы создать URL-адрес, который загружает файл stati c в качестве ответа.

from flask import send_file

@app.route('/get-image/<user>')
def get-image(user):
    """Serves static image loaded from db."""

    user = Users.objects(name=user).first()

    return send_file(io.BytesIO(user.picture.read()),
                     attachment_filename='image.jpg',
                     mimetype='image/jpg')

Чтобы вышеприведенное решение заработало, вам необходимо используйте FileField() вместо ReferenceField() в вашей модели документа:

PS: я не уверен, что вы можете архивировать это с помощью ReferenceField, в приведенном ниже методе используется gridfs, что, кажется, является подходящим способом.

class Users(db.Document):
    _id = db.StringField()
    name = db.StringField()
    picture = db.FileField()
    email = db.StringField()
    password = db.StringField()
    meta = {'collection': 'Users'}

И вы можете загрузить файл в модель следующим образом:

user = Users.objects(name='User123').first()

with open('pic.jpg', 'rb') as fd:
    user.picture.put(fd, content_type = 'image/jpeg')
user.save()

Надеюсь, он вам подходит

http://docs.mongoengine.org/guide/gridfs.html

...