Я просто хочу, чтобы любой, кто приходит сюда в поисках ответов, знал, что Великолепная библиотека Аллесандро Молина Депо представляет собой лучший ответ на этот вопрос.
Он решает проблемы как с именами, так и с копированием, и прекрасно вписывается в ваше приложение TurboGears. Вы можете использовать его с MongoDB GridFS, как в этом примере:
from depot.manager import DepotManager
# Configure a *default* depot to store files on MongoDB GridFS
DepotManager.configure('default', {
'depot.backend': 'depot.io.gridfs.GridFSStorage',
'depot.mongouri': 'mongodb://localhost/db'
})
depot = DepotManager.get()
# Save the file and get the fileid
fileid = depot.create(open('/tmp/file.png'))
# Get the file back
stored_file = depot.get(fileid)
print stored_file.filename
print stored_file.content_type
или вы можете легко создавать поля вложений в ваших SQLAlchemy моделях, например:
from depot.fields.sqlalchemy import UploadedFileField
class Document(Base):
__tablename__ = 'document'
uid = Column(Integer, autoincrement=True, primary_key=True)
name = Column(Unicode(16), unique=True)
content = Column(UploadedFileField)
… и затем хранение документов с вложенными файлами (источником может быть файл или байты) становится таким же простым, как:
doc = Document(name=u'Foo', content=open('/tmp/document.xls'))
DBSession.add(doc)
Депо поддерживает как LocalFileStorage
, MongoDB GridFSStorage
, так и Amazon S3Storage
. И, по крайней мере, для файлов, хранящихся локально и на S3, fileid
будет сгенерировано uuid.uuid1()
.