2

这是一个奇怪的,至少对我来说。我正在将图像读入 cf 图像变量并将其保存为会话变量:

<cfimage action="read" source="myPath/image.jpg" name="myImage" />
<cfset session.image = #myImage# />

我计划在某个时候操作该图像,这就是我将其保存到变量的原因。无论如何,然后我用 cfcontent 流式传输它:

<img id="photoPlaceholder" src="/#application.root_name#/administration/PhotoManagement/displayPhoto.cfm" width="500px" />

来自模板 displayPhoto.cfm:

<cfcontent  variable="#imageGetBlob(session.image)#" />

这就是问题所在。在第一次调用之后,无论将哪个新图像传递给它,都会显示第一个检索到的图像。我尝试在 cfimage 标记之前销毁会话变量,并且我已经验证我每次都传递了正确的图像变量。显示新图像的唯一方法是刷新页面。

在我看来,cfimage 以某种方式缓存了图像,并且每次对它的新调用都不会刷新变量 myImage。CF 文档对此只字未提,谷歌也一无所获。

想法?

4

2 回答 2

3

您的问题可能是客户端。由于您的 img 标签中的 URL 没有改变(...displayPhoto.cfm),您的浏览器并没有看到您实际上指向的是新图像,因此它会继续提供已经在缓存中的图像。

您可以尝试在 src 属性的末尾添加一个随机的假参数,类似于以下伪代码:

<img id="photoPlaceholder" src="/#application.root_name#/administration/PhotoManagement/displayPhoto.cfm?somevar=#aUniqueValue#" width="500px" />

您可以从随机数生成器或时间戳生成器创建 aUniqueValue 变量。

于 2011-09-09T17:33:54.143 回答
2

您还可以在 displayPhoto.cfm 中设置 HTTP 标头,以告诉浏览器不要缓存来自该 URL 的内容。从理论上讲,这可能会更好,否则浏览器会在每次给定一个稍微不同的 URL 时将图像保存在缓存中。在缓存很大且未按站点分段的桌面上,这可能不是现实世界的问题,但是缓存有限的移动客户端可能会清除您想要缓存的其他内容。

如果图像很大或者同一版本可能会被大量加载,请查看 HTTP 标头,否则上面的方法很好(我们在我工作的应用程序中使用两者)

于 2011-09-09T19:47:29.090 回答