2

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

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

4

5 回答 5

3

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

您需要使用数据伪 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')) ?>" />

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

于 2012-06-01T12:05:55.347 回答
1

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

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

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

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

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

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

如果添加磁盘空间不是一个选项,并且图像真的只需要在很短的时间内访问,您可以创建一个cron作业来删除超过给定时间未访问的图像。

于 2012-06-01T13:07:39.143 回答
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();
于 2012-06-01T11:59:48.450 回答
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
于 2012-06-01T12:01:11.823 回答
0

问题是,您永远无法保证图像确实被查看(只要您不使用data:@geon 建议的 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 周的文件”)。

于 2012-06-01T12:00:29.363 回答