在没有GridFS的Flask中使用MongoDB存储一些小文件

时间:2017-01-17 23:30:31

标签: python mongodb flask pymongo

我正在尝试将PDF文件插入MongoDB数据库。这些文件足够小(<16兆字节),所以我认为我不需要添加GridFS的复杂性(即使它看起来很容易使用我基于我看过的教程)。如何使用flask_pymongo执行此操作(甚至使用pymongo的基本示例都会很棒)。

这是我到目前为止所得到的但是我收到以下错误:

  

bson.errors.InvalidStringData:文档中的字符串必须是有效的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类型here

1 个答案:

答案 0 :(得分:3)

使用bson.Binary类存储无类型数据:

join

二进制类型继承自Python的内置“字节”类型,因此您可以在任何使用字节的地方使用它 - 例如,将其保存到文件中,将其传递给PDF解析器。在Python 2中,此代码打印:

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']))

在Python 3中,Binary的实例将直接解码为“bytes”,因此打印出来:

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