【发布时间】:2020-01-27 10:31:46
【问题描述】:
任务是从 ftp 位置读取 JPEG 并将其编码为 base64,中间不进行任何本地保存。
这是我目前的编码:
$memstream = fopen('php://memory', 'r+');
if (ftp_fget($ftp_conn, $memstream, $imgLocation, FTP_BINARY)) {
rewind($memstream);
ob_start();
imagejpeg($memstream);
$contents = ob_get_contents();
ob_end_clean();
$vCard->add('PHOTO', base64_encode($contents), ['TYPE' => 'JPEG', 'ENCODING' => 'b']);
fclose($memstream);
}
但我在imagejpeg($memstream); 行收到错误:提供的资源不是有效的图像资源...
我通过将下载的图像保存在本地来检查资源:
$imgFile = fopen('test.jpg', 'r+');
if (ftp_fget($ftp_conn, $imgFile, $imgLocation, FTP_BINARY)) {
fclose($imgFile);
}
没关系。
所以我有点疑惑,为什么相同的资源如果我将它存储在内存中就不应该有效?
【问题讨论】:
-
一些观察:1) 你没有检查
imagejpeg是成功还是失败。 2)ob_get_contents()获取当前输出缓冲区的内容。据我所知,这与$memstream无关。 -
imagejpeg首先在那里做什么?这是 GDLib 的一部分,用于实际图像操作。根据你的问题,你不想在这里做任何图像处理,你只想从 FTP 中获取图像的内容,并输出 base64 编码......所以这根本不应该使用任何图形库函数,这个是一个简单的file操作;该文件恰好是图像 - 绝对无关紧要。