我制作了一个非常简单的单用户数据库应用程序,将web2py部署到桌面计算机上。我选择web2py的原因在于其简单性和非侵入式Web服务器。
我的问题是我需要将现有数据库从我刚刚预处理并准备好的另一个应用程序迁移到一个csv文件中,该文件现在可以完美地导入到web2py的sqlite数据库中。
现在,我的其中一个表中的'upload'字段有问题,这对应于一个小图像,我已将该字段格式化为de csv,其中包含相应.jpg文件的名称从原始数据库中提取。问题是我没有管理如何将这些正确插入上传文件夹,因为web2py引擎自动将用户上传的文件名更改为安全格式,并且将我的文件直接复制到该文件夹不起作用。
我的问题是,是否有人知道将此图像集合包含在uploads文件夹中的正确方法?我不知道是否有办法禁用此保护,或者我是否必须手动将其名称更改为有效的哈希。我也考虑过将自动插入过程编码到数据库中的想法......
感谢所有人的关注!
编辑(一个工作示例):
示例数据库:
db.define_table('product',
Field('name'),
Field('color'),
Field('picture', 'upload'),
)
然后使用我的应用程序中的默认appadmin模块,我导入一个csv文件,其中包含以下格式的条目:
product.name,product.color,product.picture
"p1","red","p1.jpg"
"p2","blue","p2.jpg"
然后在我的应用程序中,我有通常的下载功能:
def download():
return response.download(request, db)
我呼吁请求上传到数据库中的图像,例如,包含在视图中:
<img src="{{=URL('download', args=product.picture)}}" />
所以我的问题是我拥有与数据库记录相对应的所有图像,我需要将它们导入到我的应用程序中,方法是将它们正确地包含在uploads文件夹中。
答案 0 :(得分:0)
如果您希望通过标准的web2py文件上传机制命名文件(出于安全原因这是一个好主意)并且可以通过内置的response.download()
方法轻松下载,那么您可以执行类似以下
在/yourapp/controllers/default.py中:
def copy_files():
import os
for row in db().select(db.product.id, db.product.picture):
picture = open(os.path.join(request.folder, 'private', row.picture), 'rb')
row.update_record(picture=db.product.picture.store(picture, row.picture))
return 'Files copied'
然后将所有文件放在/ yourapp / private目录中并转到URL / default / copy_files(您只需要执行一次)。这会将每个文件复制到/ uploads目录并重命名,并将新名称存储在db.product.picture
字段中。
注意,上面的函数不一定是控制器动作(但如果你这样做,你应该在完成时删除该函数)。相反,它可能是您通过web2py命令行运行的脚本(需要在应用程序环境中运行才能访问数据库连接和模型,以及对正确/ uploads文件夹的引用) - 在这种情况下,您需要在最后调用db.commit()
(在HTTP请求期间不需要这样做)。
或者,您可以保留原样,而不是(a)手动管理上传和下载,而不是依赖web2py的内置机制,或(b)创建custom_store
和{{1功能(不幸的是,我不认为这些都有很好的文档记录)custom_retrieve
字段,它将绕过web2py的内置存储和检索功能。但是,如果你只是通过上述的一次性过程,生活可能会更容易。