4

私はMongoDBとpymongo APIをいじっています。画像ファイルを GridFS に入れることができます - 簡単に思えます:

>>> f = open('myimage.jpg', 'r')
>>> fs = gridfs.GridFS(db)
>>> fid = fs.put(f)
>>> fid
ObjectId('4efde2c27c7778121800000a')

うまくいったようです。返された _id を使用して GridFS をクエリすることもできます。

>>> fs.exists(fid)
True

しかし、ファイル全体を元に戻すことができないようです - チャンクを取得しているように見えますか?

>>> fs.get(fid).read()
'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00Z\x00Z\x00\x00\xff\xdb\x00C\x00
\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01
\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02\x01\x01
\x02\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x01\x02\x02\x02\x02\x02\x02
\x02\x02\x02\x02\xff\xdb\x00C\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x0
1\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0
2\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0
2\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\xff\xc0\x00\x11\x08\x03\x8d\x0
2X\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\
x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\
t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\
x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08
#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19'
>>> f.tell()
352256L

元のファイルで tell() を実行したところ、GridFS から取得したものよりもはるかに大きいことがわかります。GridFS から返されたファイルに対して tell() を実行すると、それは 274 の領域にあります (tell() はファイル内のポインターの位置を示すだけであることは理解していますが、それはファイルの大きさを示します。読んだ後です。)

ここで明らかに何かが欠けています!ファイル全体を GridFS から戻すにはどうすればよいですか?

Pythonのv2.7でmongodbのv2.0.2とpymongoのv2.1を実行しています。

4

3 に答える 3

1

GridFS が実際にファイル全体を保持しているかどうか、つまり、mongo コンソールを介してファイルの一部を書き込んでいないかどうかを確認できます。これにより、各ファイルの長さとともに、他の画像とともに画像が一覧表示されます。したがって、GridFS が実際にファイル全体を保持しているかどうかを確認できます。

db.fs.files.find().pretty()

ファイルが完全に保持されない場合は、GridFS への書き込み中に厄介なことをした可能性があります ( @dcrostaが言ったように)

*注意: 上記のコマンドのコレクション名を "fs" に置き換えます。お気に入り:

db.<my_collection_name>.files.find().pretty()

ファイルがたくさんある場合は、次を試してください。

db.<my_collection_name>.files.findOne({'_id' : ObjectId("your object id as a hex string")})
于 2014-12-10T16:54:55.937 に答える
1

出力データへのデータの取得

outputdata =fs.get(stored).read()

ファイル パスを定義し、書き込みモードを開く

outfilename = "path to output file"
output= open(outfilename,"w")

データを書き込んでファイルを閉じる

output.write(outputdata)
output.close()
于 2016-08-02T08:08:45.807 に答える