Source code for flask_fs.backends.gridfs

# -*- coding: utf-8 -*-
from __future__ import unicode_literals, absolute_import

import codecs
import io
import logging

from contextlib import contextmanager

from flask import send_file
from gridfs import GridFS
from pymongo import MongoClient

from flask_fs import files

from . import BaseBackend

log = logging.getLogger(__name__)


[docs]class GridFsBackend(BaseBackend): ''' A Mongo GridFS backend Expect the following settings: - `mongo_url`: The Mongo access URL - `mongo_db`: The database to store the file in. ''' def __init__(self, name, config): super(GridFsBackend, self).__init__(name, config) self.client = MongoClient(config.mongo_url) self.db = self.client[config.mongo_db] self.fs = GridFS(self.db, self.name) def exists(self, filename): return self.fs.exists(filename=filename) @contextmanager def open(self, filename, mode='r', encoding='utf8'): if 'r' in mode: f = self.fs.get_last_version(filename) yield f if 'b' in mode else codecs.getreader(encoding)(f) else: # mode == 'w' f = io.BytesIO() if 'b' in mode else io.StringIO() yield f params = {'filename': filename} if 'b' not in mode: params['encoding'] = encoding self.fs.put(f.getvalue(), **params) def read(self, filename): f = self.fs.get_last_version(filename) return f.read() def write(self, filename, content): return self.fs.put(self.as_binary(content), filename=filename) def delete(self, filename): for version in self.fs.find({'filename': filename}): self.fs.delete(version._id) def list_files(self): for f in self.fs.list(): yield f def serve(self, filename): file = self.fs.get_last_version(filename) return send_file(file, mimetype=file.content_type) def metadata(self, filename): f = self.fs.get_last_version(filename) return { 'checksum': 'md5:{0}'.format(f.md5), 'size': f.length, 'mime': f.content_type or files.mime(filename), 'modified': f.upload_date,
}