作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在尝试找出使用 Turbogears 2 管理文件上传的“最佳实践”方法,但到目前为止还没有真正找到任何示例。我已经找到了一种实际上传文件的方法,但我不确定它对我们来说有多可靠。
此外,获取上传文件名的好方法是什么?
file = request.POST['file']
permanent_file = open(os.path.join(asset_dirname,
file.filename.lstrip(os.sep)), 'w')
shutil.copyfileobj(file.file, permanent_file)
file.file.close()
this_file = self.request.params["file"].filename
permanent_file.close()
所以假设我理解正确,这样的事情会避免核心“命名”问题吗? id = UUID。
file = request.POST['file']
permanent_file = open(os.path.join(asset_dirname,
id.lstrip(os.sep)), 'w')
shutil.copyfileobj(file.file, permanent_file)
file.file.close()
this_file = file.filename
permanent_file.close()
最佳答案
我只想让来这里寻找答案的人知道 Allesandro Molina很棒的图书馆 Depot构成了这个问题的最佳答案。
它解决了命名和复制问题,并且可以很好地整合到您的 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)
Depot 支持 LocalFileStorage
,MongoDB的 GridFSStorage
和亚马逊的 S3Storage
.而且,至少对于存储在本地和 S3 中的文件,fileid
将由 uuid.uuid1()
生成。
关于python - 使用 Turbogears 2 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375290/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!