【问题标题】:PHP encoding JPEG from ftp location without local filePHP从没有本地文件的ftp位置编码JPEG
【发布时间】: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操作;该文件恰好是图像 - 绝对无关紧要。

标签: php image jpeg in-memory


【解决方案1】:

第二条评论让我找到了正确的问题。然后谷歌很友好地把我指向stream_get_contents

if (ftp_fget($ftp_conn, $memStream, $imgLocation, FTP_BINARY)) {
    rewind($memStream);
    $contents = stream_get_contents($memStream);
    $vCard->add('PHOTO', base64_encode($contents), ['TYPE' => 'JPEG', 'ENCODING' => 'b']);
    fclose($memStream);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多