如何使用PHP删除图像后显示图像


How to show image after deleting it using PHP

>我正在通过PHP即时生成图像并将它们保存在临时目录中并在智能模板中显示。我希望在智能中显示图像后自动删除图像。
是否可以在以smarty显示图像之前删除图像并使用缓冲区或其他东西在页面上显示图像?
我的问题是我从网络服务获取图像(字符串格式)。现在我转换PNG图像中的字符串并暂时保存。我将图像分配给一个智能变量,然后模板显示图像。base64格式的限制是我正在使用"Tikiwiki"cms。我为此创建了一个包含在 CK编辑器中的模块。Tikiwik 中的 Ckeditor 不喜欢图像源中的长 base64 字符串,它会损坏所有页面源(希望你明白).
在 smarty 中显示图像后,我可以删除图像吗?

如果您只显示一次图像,则可以将其作为 HTML 中的内联数据而不是 URL 发送到浏览器。

您需要使用数据伪网址方案:http://en.wikipedia.org/wiki/Data_URI_scheme

图像数据本身需要以 base 64 为基数编码。喜欢这个:

<img src="data:image/jpeg;base64,<?= base64_encode(file_get_contents('my_image.jpg')) ?>" />

一旦您将图像数据读入字符串,就可以将其删除,甚至更好的是,首先不要将其写入磁盘。

我认为不可能按照你所说的方式做到这一点,但你可以这样做。

不要引用实际图像,而是引用代理页面,在其中放置以下代码:

$imageUrl = "/images/123.jpg"; // link to image
$imginfo = getimagesize($imageUrl); // get mime info
header("Content-type: " . $imginfo['mime']); // add Content-type header
readfile($imageUrl); // show image
unlink($imageUrl); // delete image

尝试通过 php 文件显示图像来读取 "图像文件" 数据(例如 image.php?imageid=111)

下面是一个 jpeg 图像的示例

header ('Content-length: ' .filesize($image_file));
header ('Content-type: image/jpeg');
readfile ($image_file);
unlink($image_file);
die();

我猜您正在某种控制器中生成图像,然后将图像URL放入您的Smarty模板中。然后呈现模板并将其发送到浏览器,之后浏览器通过 HTML 页面中的 URL 请求生成的图像。

现在,您要在将图像发送到浏览器后将其删除,以节省磁盘空间:

随着时间的推移,临时目录可能会充满图像。我们每次都必须清洁它。

在生成资源

后删除资源,当以后再次需要它们时,不是一个不错的解决方案,因为生成图像是一个占用大量 CPU 的过程,因此您应该尽可能多地缓存它们。

这里唯一明智的做法就是获得更多磁盘空间:在生成数据的站点上拥有更多用户需要更多空间。

一个不太糟糕的选择是按照geon的建议内联图像,但是您说由于"限制"而无法使用base64。这有什么限制?但是,每个请求都会导致再次生成图像。

如果无法添加磁盘空间,并且映像实际上只需要在短时间内可访问,则可以创建一个cron作业,删除超过给定时间未访问的图像。

问题是,你永远无法保证图像真的被查看(只要你不使用@geon建议的data: URI方法)。您无法确定,图像是否真的仅由您为其创建的客户端查看。

不过,有一种黑客解决方法:在用户会话中存储图像和随机哈希之间的链接,并传递(和删除)图像(如果此哈希出现在 URL 中):

if (isset($_GET['_imagelink'])) {
    if (isset($_SESSION[$_GET['_imagelink']])) {
        $path = $_SESSION[$_GET['_imagelink']];
        if (is_file($path)) {
            readfile($path);
            unlink($path);
        }
    }
}

在上一个请求的 Smarty 模板中,您只需要知道 secret _imagelink 变量并使用 ?_imagelink={$_imagelink} 回显 URL。

缺点是,您需要不时手动清理临时文件夹以自动删除未请求的文件。但是,您可以使用 cron-job 轻松做到这一点("删除所有匹配/tmp/*.jpg超过 1 周的文件")。