2017-01-17 4 views
0

Я пытаюсь вставить PDF-файлы в базу данных MongoDB. Файлы достаточно малы (< 16 MegaBytes), поэтому я не думаю, что мне нужно добавить сложность GridFS (хотя она выглядит довольно простой в использовании на основе обучающих программ, которые я видел). Как это сделать, используя flask_pymongo (или даже базовый пример с использованием pymongo будет замечательным).Хранение небольших файлов с MongoDB в Flask БЕЗ GridFS

Вот что я до сих пор, но я получаю следующее сообщение об ошибке:

bson.errors.InvalidStringData: strings in documents must be valid UTF-8

flask_app.py:

from flask import Flask, render_template_request 
from flask_pymongo import PyMongo 

app = Flask(__name__) 
app.config['MONGO_DBNAME'] = 'records' 
app.config['MONGO_URI'] = 'mongodb://localhost:27017/records' 
mongo = PyMongo(app) 

@app.route('/', methods=['GET', 'POST']) 
def upload(): 
    if request.method = 'POST': 
     files_collection = mongo.db.files_collection # connect to mongodb collection 
     input_file = request.files['input_file'] # get file from front-end 
     files_collection.insert_one({'data': input_file.read() }) # error occurs here 
     return 'File uploaded' 
return render_template('index.html') 

index.html:

<form method='POST' action="{{ url_for('upload') }}" enctype='multipart/form-data'> 
    <input type='file' name='input_file'> 
    <input type='submit' value='Upload'> 
</form> 

Походит Мне просто нужно преобразовать данные в соответствующий тип данных, прежде чем вводить его в mongodb, который, как представляется, равен binData t Ype на основе этого ответа here

ответ

2

Используйте bson.Binary класс для хранения нетипизированных данные:

from bson import Binary 
my_pdf_data = b'xxx' # bytes, can be anything, not just UTF-8 

db.collection.insert({'data': Binary(my_pdf_data)}) 
document = db.collection.find_one() 
print(repr(document['data'])) 
print(type(document['data'])) 

Бинарного типа наследует от встроенных «байт» Питона типа, так что вы можете использовать его везде, где вы используете байты - например, сохраните его в файл, передайте его в парсер PDF. В Python 2 этот код печатает:

Binary('xxx', 0) 
<class 'bson.binary.Binary'> 

В Python 3, экземпляры Binary будут расшифрованы непосредственно в "байт", так это печатает:

b'xxx' 
<class 'bytes'> 
Смежные вопросы