我最近跳进了 Web2py 框架,我觉得它非常好。但是,我现在遇到了一个“基本”问题。
语境
我正在构建的网站是科学代码的界面:人们填写表格并提交。数据(写入共享文件夹内的文件)然后由代码处理,在后台作为守护程序运行(代码与网站没有链接,除了这个共享文件夹和之间的 JSONRPC 链接code->website
)。该代码会生成我希望向网站用户提供的文件和图像(即,将他们要求的结果返回给他们)。工作完成后,代码使用 JSONRPC 服务链接将结果“推送”到网站,效果很好。结果位于具有生成名称的文件夹中,该名称基本上具有以下结构:
unique_folder_name/
file1.txt
file2.csv
file3.xls
image1.png
image2.png
当前的实现(不能正常工作)
目前我有 3 个数据库:
# Job database
db.define_table("job",
Field('owner', 'string', length=60, required=True, writable=True, readable=True),
Field('uniq_id', "string", length=60, required=True, unique=True, writable=False, readable=True))
# Result database
db.define_table("result",
Field("job", "reference job"),
Field("x", "integer", default=1),
Field("y", "integer", default=0),
Field("z", "integer", default=0),
Field("data", "string", length=500),
Field("message", "string", length=200))
# File database
db.define_table("file",
Field("job", "reference job"),
Field("file", "upload"),
Field("isimage", "boolean", default=False))
当代码“推送”结果时,Web2py 中的某些模块会在“结果”数据库中创建条目,并在与作业关联的“文件”数据库中创建条目。由于我没有找到一种方法来使 Web2py 可以使用文件(已经在文件系统上)而不将其复制到上传文件夹,因此我目前存储这样的文件(在一个模块中):
stream = open(os.path.join(directory, _file), 'rb')
current.db.file.insert(job=jid, file=current.db.file.file.store(stream, _file), isimage=isimg)
然后,当我想用图像创建一个视图时,我会(在一个模块中):
rows = current.db((current.db.file.job==jid) & (current.db.file.isimage==True)).select()
for row in rows:
div.append(I(_src=URL(c="default", f="download", args=os.path.join(directory, row.file)), _width="500", _height="500"))
并在视图中:`{{=div}}`
问题
这只是行不通......显示页面的源代码如下:
<i height="500" src="/mycode/default/download//path/to/directory/file.file.9b7d3a0367de0843.6d732d72732e706e67.png" width="500"></i>
如果我在地址栏中输入此 URL,则文件下载正确,否则图像不会显示在网页上。此外,我必须提供文件的路径,即使 Web2py 确实将文件复制到“上传”文件夹中(使用其新的安全丑名称:)),否则链接不起作用。所以:没有显示图像,而且文件无论如何都会复制到“上传”文件夹中:(
我迷路了,不知道如何解决这个问题。(我还尝试在构建图像 URL 时添加请求对象,并且还尝试了自定义下载功能......到目前为止还没有工作)。
编辑(解决方案)
好吧,我的代码中有一个明显的错误,我错过了:图像标签助手不是I
,但是IMG
:) 与 twitter bootstrap 图标中使用的标签混淆引起的简单错误I
......这样就解决了显示问题。对于流文件而不在上传文件夹中复制它们(即不使用upload
数据库中的字段),rochacbruno(非常感谢他)让我走上了正确的轨道。有关完整解决方案,请参阅我自己的答案。