代码之家  ›  专栏  ›  技术社区  ›  Hamzeh Hirzallah

应用引擎PHP生成图像缩略图

  •  4
  • Hamzeh Hirzallah  · 技术社区  · 8 年前

    我想 生成缩略图 a的图像 PDF文件 使用存储在google bucket上 imagick公司 和PHP
    我在上部署应用程序 谷歌应用程序引擎(GAE)标准环境
    问题是我一直在犯这个错误

    Fatal error: Uncaught exception 'ImagickException' with message  
    'UnableToWriteBlob `magick--1noB3XBwJhgfn': Read-only file system
    

    我知道应用程序部署到的文件系统是不可写的,但我需要一种方法来实现这一点。。。

    这是我的密码

    <?php
    putenv('MAGICK_TEMPORARY_PATH='.sys_get_temp_dir());
    
    $imagick = new Imagick();
    
    // get the content of pdf url
    $imagenblob=file_get_contents('http://www.pdf995.com/samples/pdf.pdf');      
    
    // read the content and load it inn imagick instance
    $imagick->readimageblob($imagenblob);                                        
    
    // point to the first page, because I want thumbnail for first page
    $imagick->setIteratorIndex(0);        
    
    // set image format
    $imagick->setImageFormat('png');       
    
    // resize image
    $imagick->resizeImage(320,320,Imagick::FILTER_LANCZOS,1,1);
    
    // return the result
    header("Content-Type: image/png");          
    $base64 = 'data:image/png;base64,' . base64_encode($imagick);
    exit($base64);
    

    也许我可以更改imagick用来编写的目录,但我没能做到!!

    4 回复  |  直到 8 年前
        1
  •  1
  •   emcconville    8 年前

    ImageMagick需要一个临时目录来在代理解码/编码过程中写入工件。我不熟悉 ,但文件表明 tempnam() & sys_get_temp_dir() 应使用。

    putenv('MAGICK_TEMPORARY_PATH='.sys_get_temp_dir());
    $imagick = new Imagick(); 
    // ...
    

    还要注意,ImageMagick使用Ghostscript进行PDF解码。验证 gs 已安装二进制文件(&P);如果使用PDF文件,则可用。

        2
  •  1
  •   Dan Cornilescu    8 年前

    你打到了 restrictions of the standard environment sandbox :

    应用程序引擎应用程序无法:

    • 写入文件系统。PHP应用程序可以使用 Google Cloud Storage 用于存储持久文件。从文件系统读取是 允许,并且随应用程序上载的所有应用程序文件 可获得的

    一种选择(成本更高)是使用灵活的环境,它没有这样的限制。

    另一种方法是尝试配置 imagick 不使用中间/临时文件(如果它支持,则毫无线索)或使用内存中的文件模拟(如果PHP支持,则donno,我是python用户),并通过 Imagick::setFilename

    另一种尝试是使用 setFormat 而不是 setImageFormat ,上的注释 setImageFormat 建议 可以 可以在写入文件之前/之前进行转换:

    要设置整个对象的格式,请使用Imagick::setFormat 方法E、 g.加载TIFF文件,然后在Imagick上使用setFormat('pdf') 对象,然后writeImagesFile('foo.pdf')或getImagesBlob()。

        3
  •  1
  •   Graham P Heath Bergi    6 年前

    由于两种对立的力量在起作用,因此没有真正的方法来实现这一点:

    1) Google App Engine标准的沙盒限制

    2) Imagick显然需要本地文件系统访问(至少暂时)才能工作。

    因此,如果您无法改变Imagick的工作方式,那么剩下的唯一解决方案就是不使用GAE标准。您可以使用GAE Flex或Google计算引擎。我不知道为什么Flex不是你的选择;你不需要把整个项目移过去。您可以将此部分移植为 microservice 在同一项目中的GAE Flex上。该服务的唯一功能是处理图像并获取缩略图。然后,您可以将缩略图放在谷歌云存储桶中,以供应用程序的其余部分(GAE标准)使用。

        4
  •  0
  •   Hamzeh Hirzallah    8 年前

    对于任何面临同样问题的人,我通过创建一个新的Google计算引擎解决了我的问题,在引擎上安装了PHP,我创建了一个函数,使用Imagick将pdf转换为图像,并将响应作为base64流返回。

    Imagick不能很好地处理GAE上的pdf文件

    推荐文章