折腾:
【已解决】用Python去连接本地mongoDB去用GridFS保存文件
期间,需要去搞清楚,如何用Python的PyMongo的GridFS的put去保存文件,比如本地的一个mp3文件:
GridFS Example — PyMongo 3.6.1 documentation
也是可以用:
<code># fsCollection = gridfsDb.fs fsCollection = gridfsDb["fs"] </code>
去获取collection的
然后代码:
<code># -*- coding: utf-8 -*- # import pymongo from pymongo import MongoClient import gridfs import pprint mongoClient = MongoClient() gridfsDb = mongoClient.gridfs collectionNames = gridfsDb.collection_names(include_system_collections=False) pprint.pprint(collectionNames) # fsCollection = gridfsDb.fs fsCollection = gridfsDb["fs"] someFile = fsCollection.files.find_one() pprint.pprint(someFile) ottoTheCatFile = fsCollection.files.find_one({"filename": "Otto the Cat-withMIME.MP3"}) pprint.pprint(ottoTheCatFile["filename"]) pprint.pprint(ottoTheCatFile["_id"]) pprint.pprint(ottoTheCatFile["chunkSize"]) pprint.pprint(ottoTheCatFile["contentType"]) pprint.pprint(ottoTheCatFile["length"]) pprint.pprint(ottoTheCatFile["md5"]) pprint.pprint(ottoTheCatFile["uploadDate"]) </code>
输出:
<code>[u'fs.chunks', u'fs.files'] {u'_id': ObjectId('5abc43a4a4bc712159a35cd9'), u'chunkSize': 261120, u'contentType': u'audio/mpeg', u'filename': u'Otto the Cat-withMIME.MP3', u'length': 8338105, u'md5': u'b7660d833085e9e1a21813e4d74b0cc3', u'uploadDate': datetime.datetime(2018, 3, 29, 1, 38, 44, 853000)} u'Otto the Cat-withMIME.MP3' ObjectId('5abc43a4a4bc712159a35cd9') 261120 u'audio/mpeg' 8338105 u'b7660d833085e9e1a21813e4d74b0cc3' datetime.datetime(2018, 3, 29, 1, 38, 44, 853000) </code>
再去试试put,且带额外参数的
gridfs – Tools for working with GridFS — PyMongo 3.6.1 documentation
mongo gridfs put file
How do I save a file to MongoDB? – Stack Overflow
A primer for GridFS using the Mongo DB driver — MongoDB Node.JS Driver 1.4.9 documentation
Building MongoDB Applications with Binary Files Using GridFS: Part 1 | MongoDB
Building MongoDB Applications with Binary Files Using GridFS: Part 2 | MongoDB
Uploading files to MongoDB GridFS — Matthias Noback – Blog
mongo gridfs python example
mongo-python-driver/gridfs.rst at master · mongodb/mongo-python-driver
奶奶的,就是没有 普通的file文件的事例代码。
虽然前面的example能基本看懂,但是没有合适的直接的借用的file的例子啊
<code>fileID = fs.put( open( r'owl.jpg', 'r') ) </code>
Mongodb GridFS using Python – Abhay PS
终于有了:
<code>with open('/tmp/first-invoice.pdf') as f: ... invoice = fs.put(f, content_type='application/pdf', filename='first-invoice.pdf') </code>
Get to Know GridFS: The MongoDB Filesystem – DZone Database
去试试
结果出错:
【已解决】PyMongo的GridFS中使用fs的collection去put出错:TypeError Collection object is not callable
去命令行中看看,就有了:
<code>> db.fs.files.find().pretty() { "_id" : ObjectId("5abc43a4a4bc712159a35cd9"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-03-29T01:38:44.853Z"), "length" : 8338105, "md5" : "b7660d833085e9e1a21813e4d74b0cc3", "filename" : "Otto the Cat-withMIME.MP3", "contentType" : "audio/mpeg" } { "_id" : ObjectId("5abc8d77a4bc71563222d455"), "contentType" : "application/mpeg", "chunkSize" : 261120, "filename" : "Lots of Hearts_withMIME.mp3", "length" : 4795707, "uploadDate" : ISODate("2018-03-29T06:53:43.744Z"), "md5" : "955d19f230a5824e0fd5f41bee3dda21" } </code>
【总结】
此处用PyMongo的put去保存文件的完整代码是:
<code># -*- coding: utf-8 -*- import pymongo from pymongo import MongoClient import gridfs from gridfs import GridFS import os import logging import re mongoClient = MongoClient() logging.info("mongoClient=%s", mongoClient) # gridfsDb = mongoClient.gridfs gridfsDb = mongoClient.gridfs logging.info("gridfsDb=%s", gridfsDb) collectionNames = gridfsDb.collection_names(include_system_collections=False) logging.info("collectionNames=%s", collectionNames) # fsCollection = gridfsDb.fs # fsCollection = gridfsDb["fs"] fsCollection = GridFS(gridfsDb) logging.info("fsCollection=%s", fsCollection) # test put local file curAudioFilename = "英语资源\All Aboard Reading\音频\Lots of Hearts.mp3" curAudioFilenameFiltered = re.sub(r"\\", "/", curAudioFilename) #'英语资源/All Aboard Reading/音频/Lots of Hearts.mp3' # curAudioFullFilename = "/Users/crifan/dev/dev_root/company/naturling/数据/FromMaggie/" + curAudioFilename pathPrefix = "/Users/crifan/dev/dev_root/company/naturling/数据/FromMaggie/" curAudioFullFilename = os.path.join(pathPrefix, curAudioFilenameFiltered) if os.path.isfile(curAudioFullFilename): with open(curAudioFullFilename) as audioFp : audioFileId = fsCollection.put(audioFp, filename="Lots of Hearts_withMIME.mp3", content_type="application/mpeg") logging.info("audioFileId=%s", audioFileId) else: logging.error("Can not find file: %s", curAudioFullFilename) </code>
保存文件后的效果:
<code>> db.fs.files.find().pretty() { "_id" : ObjectId("5abc8d77a4bc71563222d455"), "contentType" : "application/mpeg", "chunkSize" : 261120, "filename" : "Lots of Hearts_withMIME.mp3", "length" : 4795707, "uploadDate" : ISODate("2018-03-29T06:53:43.744Z"), "md5" : "955d19f230a5824e0fd5f41bee3dda21" } </code>