2017-01-17 1 views
0

Ich versuche, PDF-Dateien in eine MongoDB-Datenbank einzufügen. Die Dateien sind klein genug (< 16 MegaBytes), also glaube ich nicht, dass ich die Komplexität von GridFS hinzufügen muss (obwohl es aufgrund der Tutorials, die ich gesehen habe, ziemlich einfach zu verwenden ist). Wie kann ich dies tun mit flask_pymongo (oder sogar ein einfaches Beispiel mit pymongo wäre toll).Speichern einiger kleiner Dateien mit MongoDB in Flask OHNE GridFS

Hier ist, was ich bisher habe, aber ich bin die folgende Fehlermeldung erhalten:

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> 

Scheint Ich muss nur die Daten in den richtigen Datentyp konvertieren, bevor Sie es in mongodb eingeben, die binData t scheint yp auf diese Antwort basiert here

Antwort

2

Verwenden Sie die bson.Binary Klasse nicht typisierte Daten zu speichern:

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

Die binäre Art von Pythons eingebauten „Bytes“ Typ erbt, so können Sie es verwenden, wo immer Sie Bytes verwenden - zB Speichern Sie es in einer Datei, übergeben Sie es an einen PDF-Parser. In Python 2 dieser Code druckt:

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

In Python 3 wird Instanzen von Binary decodiert werden direkt auf "Bytes", so dass diese Drucke:

b'xxx' 
<class 'bytes'> 
Verwandte Themen