7

tornado と pil と mongodb を使ってこれをやろうとしています。

avat = self.request.files['avatar'][0]["body"]
nomfich = self.request.files['avatar'][0]["filename"]

try:
    image = Image.open(StringIO.StringIO(buf=avat))
    size = image.size
    type = image.format

    avatar = r"/profile-images/{0}/{1}".format(pseudo, nomfich)

except IOError:
    self.redirect("/erreur-im")

およびデータベース コード:

user={
    "pseudo": pseudo, 
    "password":password, 
    "email":email, 
    "tel":tel, 
    "commune":commune,    
    "statut":statut, 
    "nom":nom, 
    "prenom":prenom, 
    "daten":daten, 
    "sexe":sexe, 
    "avatar":avatar
}

self.db.essog.insert(user)  

「アバター」は保存されますが、画像はなく、名前だけが保存されます。

私の問題は:

  • データベースが画像を処理する方法を理解するには、image.save(path, format) を作成する必要がありますが、パスは通常のシステム パス (Windows または Linux) のパスですか?
  • プロファイルはシンプルで、画像のアップロードを 500ko に制限しました。mongodb のドキュメントは 16 MB であるため、ドキュメントはプロファイル全体を処理しますが、画像が含まれる小さなドキュメントでも gridFS を使用する必要がありますか? 重要な問題は、画像の保存のパスにあります。立ち往生しています。データベースを扱うのは初めてなので、その質問は申し訳ありません。
4

4 に答える 4

18

MongoDB にファイルを保存するために GridFS が必ずしも必要というわけではありませんが、メタデータも利用できるようにしながら、バイナリ データの分割と保存を処理するため、GridFS は確実に優れたエクスペリエンスになります。その後、ドキュメント内の ID をUserアバター画像に保存できます。

それはさておき、コードではデータを保存していませんが、バイナリデータをドキュメントに直接保存することもできます。で開くだけでPIL.Image、何もしません。

ドライバーに使用していると仮定すると、バイナリデータをコンテナーpymongoにラップして保存するだけでよいと思います。これは私がテストしていませんが、うまくいくはずです:Binary

from pymongo.binary import Binary

binary_avatar = Binary(avat)

user={
    ...
    "avatar":avatar,
    "avatar_file": binary_avatar
    ...
}

そうは言っても...自分で簡単にしてGridFSを使用してください。それがその目的です。

GridFS を使用する場合は、次のようになります。

from gridfs import GridFS

avat_ctype = self.request.files['avatar'][0]["content_type"]

fs = GridFS(db)
avatar_id = fs.put(avat, content_type=avat_ctype, filename=nomfich)

user={
    ...
    "avatar_name":avatar,
    "avatar_id": avatar_id
    ...
}
于 2012-08-11T18:22:28.287 に答える
14

これは、gridfs を使用せずに mongodb に画像を挿入および取得するためのコードです。

def insert_image(request):
    with open(request.GET["image_name"], "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read())
    print encoded_string
    abc=db.database_name.insert({"image":encoded_string})
    return HttpResponse("inserted")

def retrieve_image(request):
    data = db.database_name.find()
    data1 = json.loads(dumps(data))
    img = data1[0]
    img1 = img['image']
    decode=img1.decode()
    img_tag = '<img alt="sample" src="data:image/png;base64,{0}">'.format(decode)
    return HttpResponse(img_tag)
于 2013-12-31T12:28:44.977 に答える
0

pymongo の Binary() データ型を使用してバイナリ データを保存する必要があります。

http://api.mongodb.org/python/2.0/api/bson/binary.html#module-bson.binary

于 2012-08-11T18:20:57.403 に答える