Загрузить файл (размером <16 МБ) в MongoDB

#python #mongodb #file #file-upload

#python #mongodb #файл #загрузка файла

Вопрос:

У меня есть требование загрузить файл в MongoDB. В настоящее время я сохраняю файлы в папке в текущей файловой системе с помощью Flask. Есть ли способ загрузить файл в MongoDB без использования GridFS? Я полагаю, что я делал что-то подобное задолго до этого, но я не могу вспомнить, поскольку прошло много времени с тех пор, как я в последний раз использовал MongoDB.

Любой файл, который я выбираю для загрузки, имеет размер не более 16 МБ.

Обновление: я попробовал это для преобразования файла изображения с помощью binData , но он выдает ошибку global name binData is not defined .

 import pymongo
import base64
import bson

# establish a connection to the database
connection = pymongo.MongoClient()

#get a handle to the test database
db = connection.test
file_meta = db.file_meta
file_used = "Headshot.jpg"

def main():
    coll = db.sample
    with open(file_used, "r") as fin:
        f = fin.read()
        encoded = binData(f)

    coll.insert({"filename": file_used, "file": f, "description": "test" })
  

Комментарии:

1. Вы пробовали сохранить его как большой двоичный объект в документе?

Ответ №1:

Mongo BSON (https://docs.mongodb.com/manual/reference/bson-types /) имеет двоичный тип данных ( binData ) для поля.
Драйвер Python (http://api.mongodb.com/python/current/api/bson/binary.html ) поддерживает его.

Вы можете сохранить файл в виде массива байтов.

Ваш код должен быть слегка изменен:

  1. Добавить импорт: from bson.binary import Binary
  2. Кодирование байтов файла с использованием двоичного кода: encoded = Binary(f)
  3. Используйте закодированное значение в инструкции insert.

Полный пример ниже:

 import pymongo
import base64
import bson
from bson.binary import Binary

# establish a connection to the database
connection = pymongo.MongoClient()

#get a handle to the test database
db = connection.test
file_meta = db.file_meta
file_used = "Headshot.jpg"

def main():
    coll = db.sample
    with open(file_used, "rb") as f:
        encoded = Binary(f.read())

    coll.insert({"filename": file_used, "file": encoded, "description": "test" })
  

Комментарии:

1. Я не могу загружать файлы, используя тип binData. Не уверен, что я на правильном пути, конвертируя файл в использование binData. Не могли бы вы сообщить мне, что не так с этим кодом.

2. Большое вам спасибо @Mike. Это сработало как шарм. Однако одно небольшое исправление. Мне пришлось открыть файл в режиме «rb».