在向用户显示jpeg文件时动态重命名它们

时间:2011-03-08 20:07:44

标签: php html http-headers jpeg filenames

我正在尝试动态重命名jpeg图像文件,因为它显示给用户。

我有一个文件image_generate.php,代码如下:

$file = $_GET['file'];
$imagepath = "path/to/image.jpg";
$image = imagecreatefromjpeg($imagepath);
header('Content-Type: image/jpeg');

$filename = "[site.com]_some_image_name_here";
header('Content-Disposition: attachment; filename="' . $filename . '.jpg"');

imagejpeg($image, NULL, 100);
imagedestroy($image); // Free up memory

它由html图像标记调用,如:

<img src="image_generate.php?file=imagenamehere" />

到目前为止,输出结果如下:

  • 当我右键单击图像,然后单击“查看图像”时,会弹出一个下载对话框,询问我是否要保存文件“[site.com] _some_image_name_here.jpg”(我希望如此发生)
  • 如果我右键单击图像,然后单击“将图像另存为”或“保存图像”,则要保存的文件名将显示为原始文件名(无论变量$ file是否能够获取)。

如何修复第二部分?即使用户点击“将图像另存为”或“保存图像”,我也想修改图像的文件名。

我尝试将代码更改为:

...

$rename = $filename . ".jpg";
imagejpeg($image, $rename, 100);
imagedestroy($image); // Free up memory

但是图像无法显示在带有html标记的页面上(显示为损坏的图像)。 我对html标题和Content-Dispositions不是很熟悉。我猜哪里有错误......? 有什么想法吗?

感谢您阅读!

编辑:.htaccess

<IfModule mod_rewrite.c>

RewriteEngine On

# Sends image download request to image_generate.php for parsing
RewriteRule ^path/from/img/tag/downloads/(.*).jpg$ path/to/image_generate.php?file=$1 [NC,L]
RewriteRule ^path/to/image_generate.php$ /home/path/to/image_generate.php [NC,L]

</IfModule>

1 个答案:

答案 0 :(得分:3)

不同的浏览器会有不同的行为。

例如,在执行Right Click > Save Image As时,Internet Explorer不会尝试在显示保存文件对话框之前获取任何标头信息(它会自动假定您要保存请求的结果,而不管结果如何是)。 Firefox也没有。因此,对于IE&amp; Firefox,通过在标题中指定文件名是不可能的。

更优雅和UA兼容的方法是使用Apache的mod_rewrite进行URL重写。 URL重写允许您将对URL的请求重新路由到另一个URL。

要进行此设置,您需要在.htaccess所在的目录中创建一个image_generate.php文件,其中包含以下内容:

RewriteEngine On
RewriteRule ^generated/([a-z0-9-]+)\.jpg$  generated_image.php?file=$1  [L]

然后,只需修改您的HTML即可指向您重写的网址。

<img src="generated/imagenamehere.jpg" />

这样做的好处是可以让您的图像生成对用户完全无缝(URL方式,它看起来就像一个静态图像)。

有关mod_rewrite的更多信息,请访问: