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

时间:2012-06-01 11:57:59

标签: php image-processing smarty

我正在通过PHP动态生成图像并将其保存在临时目录中并在 smarty 模板中显示。我希望在smarty中显示图像后自动删除图像。
是否有可能在巧妙地显示图像之前删除图像并使用缓冲区或其他东西在页面上显示图像?

我的问题是我从webservice获取图像(以字符串格式)。现在我转换PNG图像中的字符串并暂时保存。我将图像分配给smarty变量,然后模板显示图像。 base64格式的限制是我正在使用'Tikiwiki'cms。我创建了一个包含在CKeditor中的模块。 Tikiwik中的Ckeditor不喜欢图像源中的长base64字符串会破坏所有页面源(希望你得到它)。
在smarty中显示后可以删除图像吗?

5 个答案:

答案 0 :(得分:3)

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

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

图像数据本身需要进行64位编码。像这样:

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

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

答案 1 :(得分:1)

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

这是jpeg图像的示例

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

答案 2 :(得分:1)

我认为不可能像你说的那样去做,但你可以这样做。

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

$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

答案 3 :(得分:1)

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

现在,您希望在将图像发送到浏览器后将其删除,以保留磁盘空间:

  

临时目录可能会随着时间的推移而充满图像。我们每次都要清理它。

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

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

更糟糕的选择是按geon的建议内联图像,但是你说由于“限制”你不能使用base64。有什么限制?但是,每次请求都会导致图像再次生成。

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

答案 4 :(得分:0)

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

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

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

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

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