PHP链接到根目录外的图像 [使用a href而非img src]

3
这是我的情况:图片存储在根目录外。我可以通过一个外部的php文件访问它们(这正是应该的),然后使用file_get_contents,再用echoimg src命令显示,它就会完美地显示出来。
我已经安装了thickbox插件,我希望当用户点击图片时,它会在thickbox中放大显示。
<a href="img.jpg" class="thickbox"><img src="my_image_processing.php?img=img.jpg" />

我试图通过单击创建一个图片库。结果是浮层弹出了,但是图片没有显示出来。相应显示出来的是乱码和黑色钻石带问号。我猜这是图片的原始代码。

我该如何将其作为图片输出而非原始代码在页面中显示?

<a href> 's

补充说明:我刚刚对其进行了一些实验。当我去掉thickbox的类时,a href就可以起作用了。它会在下一页上正常显示图像。不幸的是,当我添加thickbox类时,它会显示出thickbox,但是它显示的是原始代码。


根据你所说的(可以直接访问my_image_processing.php?img=img.jpg),我猜测问题可能出在thickbox上(实际上是一个错误或者你自己的错误)。请再次确认你已经按照所有的说明进行操作,包括macFFBgHack.png部分。如果你仍然遇到问题,建议你编辑/重新标记你的问题,并包含所有与thickbox相关的脚本/链接/样式标签(所有相关的HTML),并告诉我们你正在使用的jquery和thickbox版本。看起来thickbox由于某些原因没有以jpeg MIME类型发送图像。 - joelhardi
是的,这个问题与Thickbox有关,但实际上问题在于Thickbox将内容识别为页面(假设*.php不是图像),并且不查看标题中发送的Content-type信息。可能的解决方案在我的答案中。 - Tadeck
4个回答

2
在你的例子中,你直接使用了jpg文件,应该像这样做:
<a href="my_image_processing.php?img=img.jpg" class="thickbox"><img src="my_image_processing.php?img=img.jpg" />

也就是说,这个 PHP 页面需要读取隐藏文件夹并返回图片。

是的,抱歉,我的程序是那样写的。我已经为此苦恼了好几天了。 - user657896
@user657896 我更新了我的代码,调用 PHP 页面的代码应该在两个地方都有,还要在 <a> 标签中添加。 - morgar

2

尝试:

header ("Content-type: image/jpeg");

如果您将原始图像数据视为文本,则可能浏览器无法将其识别为图像。您可以通过上面的标题行发出正确的MIME类型信号。
还有可能出现错误,错误消息使图像文件无法读取(因为流开始于错误消息而不是标头)。在这种情况下,在字符之前应该看到错误消息。

我已经尝试将该标题附加在顶部甚至代码之后,但两者都不起作用。 - user657896
问题在于Thickbox不使用MIME类型信息来显示内容(请参见我的答案)。但是Content-type应该被添加。 - Tadeck

1
Thickbox会通过文件扩展名识别链接资源的类型,以确定是否应该显示图像。在确定扩展名时,它也会忽略查询字符串。因此,您有以下选项:
  • 使用一些自定义URL重写,使您的脚本工作,例如使用类似于my_image_processing/img.jpg而不是my_image_processing.php?img=img.jpg的URL(搜索更多关于“mod_rewrite”的信息),
  • 重写ThickBox的代码(或搜索允许您更改该识别机制而不更改代码的选项参数-我没有找到任何),或
  • 实现其他库,允许您实现所需的内容(并允许您按照您打算的方式使用外部脚本)。

一个是让Thickbox认为它加载的是图像而不是页面,另一个是-如vbence所指出的-向您的脚本返回的图像添加适当的mime类型:您应该添加带有“Content-Type”信息的适当标头。

编辑:

负责显示图像的代码如下[sic!]:

var baseURL;
 if(url.indexOf("?")!==-1){ //ff there is a query string involved
  baseURL = url.substr(0, url.indexOf("?"));
 }else{ 
     baseURL = url;
 }

 var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
 var urlType = baseURL.toLowerCase().match(urlString);
if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp'){//code to show images

如果您选择自行修改脚本,可以添加另一种类型(“php”),但您应该意识到后果。

编辑2:

如果您选择“更改插件”选项,则有一些替代方案(ColorBox),使您能够在不需要深入代码的情况下决定是否将*.php链接视为图像。只需查找文档中的photo选项(当设置photo=true时应按预期运行)。


好的,我刚刚尝试将它重写为my_image_processing/image.jpg。我不再看到垃圾了,但现在它只是空白。当我删除这些类时,它就正常工作了。我会尝试您的编辑1和2... - user657896
关于编辑thickbox.js本身,我尝试在urlString中添加|.php$和/或添加 - user657896
您好,我想在我的JavaScript代码中添加一个urlType == '.php'的条件,但似乎没有起作用,页面仍然是空白的。您会如何添加这个更改呢?很抱歉,我对JavaScript并不是很熟悉。 - user657896

0

您可能忽略了显示图像所需的http头信息。

header("Content-type: image/jpeg");
header("Content-Disposition: attachment;"); 

他说当他使用处理页面时,图像显示正常,这不是问题。 - morgar
我猜OP不想让文件提示下载,而是直接显示。 - vbence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接