#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 ) поддерживает его.
Вы можете сохранить файл в виде массива байтов.
Ваш код должен быть слегка изменен:
- Добавить импорт:
from bson.binary import Binary
- Кодирование байтов файла с использованием двоичного кода:
encoded = Binary(f)
- Используйте закодированное значение в инструкции 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».