如何为 PHP 生成的图像设置默认的“图像另存为”名称?

Posted

技术标签:

【中文标题】如何为 PHP 生成的图像设置默认的“图像另存为”名称?【英文标题】:How do I set the default 'save image as' name for an image generated in PHP? 【发布时间】:2011-09-24 08:48:52 【问题描述】:

我的站点中有一个页面,其中显示了一些由我的 php 生成的图像。当我右键单击图像并单击将图像另存为时,我得到的默认名称是用于生成图像的 php 文件的名称。

这是例如图片的html

 <img src="picture_generator.php?image_id=5&extension=.png">

我得到的名字是: 图片生成器.php.png

有没有办法将此名称设置为默认名称?

提前致谢

【问题讨论】:

【参考方案1】:

您可以尝试使用 HTTP 标头设置文件名,但并非所有浏览器都尊重这一点。

最简单的技巧是扩展 URL,使最后一部分包含所需的文件名:

<img src="picture_generator.php/desiredfilename.jpg?image_id=5&extension=.png&name=desiredfilename.jpg">

注意我还在查询字符串的末尾添加了文件名(name 并不重要),因为某些浏览器使用该部分。

根据您的服务器配置,无需任何特殊配置(无需 mod_rewrite 或类似配置)即可立即运行。您可以通过简单地将“/foo”附加到您网站上的任何 PHP-URL 来检查它是否适用于您的服务器。如果您看到 PHP 的输出,则一切正常。如果您看到 404 错误,则说明您的服务器配置无法处理此类 URL。

【讨论】:

Oups 对不起我的错。它适用于所有浏览器。非常感谢!! 请记住,当您将代码移动到另一台服务器时,此解决方案可能会中断,因为这取决于 Web 服务器和 PHP 解释器如何协同工作。仅供参考,在您的 PHP 脚本中,您可以在 $_SERVER["PATH_INFO"] 变量 [docs] 中找到该后缀 添加一个额外的参数仍然会导致 ie10 对我只显示 untitled.jpg,也许这正是 IE 两年来所做的 @Assimilater:我的回答的 essential 部分是在“?”之前扩展 URL,即picture_generator.php/desiredfilename.jpg,而不仅仅是查询字符串。 哦,那么拥有 image.php?[insert query string] 将是我的问题。【参考方案2】:

您可以在Content-Disposition HTTP 标头中提供它:

header('Content-Type: image/png');
header('Content-Disposition: inline; filename="' . $filename . '"');

但是,某些浏览器(即 Internet Explorer)可能会忽略此标头。最安全的解决方案是伪造 URL,让浏览器相信它正在下载像/images/5/foo.png 这样的静态文件,而幕后的实际路径是/picture_generator.php?image_id=5&amp;extension=.png。这可以通过一些 Web 服务器模块来完成,例如 Apache 的 mod_rewrite。

【讨论】:

感谢重播。我试过这个但没有用。内联的附件更适合。 这适用于 android 的浏览器。我在保存带有 .php 扩展名的图像时遇到问题。这解决了它。 这应该被标记为正确答案。虽然“附件”的内容配置会弹出浏览器的下载对话框窗口,但“内联”值避免了这种情况,并且如果用户右键单击图像并单击“另存为”,仍会提供所需的文件名。旁注,我强烈劝阻人们不要使用 mod_rewrite,因为这会带来可能的风险。如今,大多数浏览器都尊重这个特定的标头。【参考方案3】:

在您的picture_generator.php 文件中,您需要添加一个带有名称的标题。比如

header("Content-Disposition: attachment; filename=\"myfile.png\""); 

【讨论】:

你确定应该是“附件”吗?这不会导致浏览器尝试下载文件而不是显示它吗? 抱歉,是从我的下载应用中复制的。我打算删除它。不,附件强制下载,但除此之外,它应该可以工作(一旦删除) 实际上它适用于所有浏览器,但不适用于 Safari。有谁知道为什么?我应该做一些特别的事情吗?

以上是关于如何为 PHP 生成的图像设置默认的“图像另存为”名称?的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中单击“将图像另存为”

SDL2:将图像另存为 png 错误

如何将图像另存为在 retrofit2 中发送到 wcf Web 服务的流中的图像

将图像另存为服务器上文件夹中的文件

如何在 BufferedImage 中使颜色透明并另存为 PNG

旋转 persp3d 绘图并将图像另存为 png