2017-01-17 14 views
0

MongoDBデータベースにPDFファイルを挿入しようとしています。ファイルは十分に小さいので(< 16メガバイト)、GridFSの複雑さを追加する必要はないと思う(見たことがあるチュートリアルに基づいて使用するのはかなり簡単だが)。 flask_pymongo(またはpymongoを使用する基本的な例ですらよい)を使用してこれを行うにはどうすればよいですか。ここでMongoDBでいくつかの小さなファイルをFlaskに保存しています。

は、私がこれまで持っているものだが、私は次のエラーを取得しています:

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

バイナリタイプはPythonの組み込みを継承し、あなたがバイトを使用どこでもあなたがそれを使用することができますので、タイプを「バイト」 - 例えば、それをファイルに保存し、PDFパーサに渡します。 Pythonの2本のコード印刷に:パイソン3において

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

、バイナリのインスタンスは "バイト" に直接復号化されるので、このプリント:

b'xxx' 
<class 'bytes'> 
関連する問題