google-app-engine,Php,Google App Engine,Pdf,Google Cloud Platform,Imagick,google App Engine" /> google-app-engine,Php,Google App Engine,Pdf,Google Cloud Platform,Imagick,google App Engine" />

应用程序引擎PHP生成图像

应用程序引擎PHP生成图像,php,google-app-engine,pdf,google-cloud-platform,imagick,google-app-engine,Php,Google App Engine,Pdf,Google Cloud Platform,Imagick,google App Engine,我想使用imagick和PHP 我在谷歌应用程序引擎(GAE)标准环境中部署我的应用程序 问题是我一直在犯这个错误 Fatal error: Uncaught exception 'ImagickException' with message 'UnableToWriteBlob `magick--1noB3XBwJhgfn': Read-only file system 我知道应用程序部署到的文件系统是不可写的,但我需要一种方法来实现这一点 这是我的密码 <?php putenv(

我想使用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);

在代理解码/编码过程中,ImageMagick需要一个临时目录来写入工件。我不熟悉,但文件建议应该使用

putenv('MAGICK_TEMPORARY_PATH='.sys_get_temp_dir());
$imagick=新的imagick();
// ...
还要注意,ImageMagick使用Ghostscript进行PDF解码。验证是否安装了
gs
二进制文件,如果使用的是w/PDF文件,则可以使用该二进制文件。

您正在点击以下命令之一:

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

  • 写入文件系统。PHP应用程序可用于存储持久文件。从文件系统中读取是非常困难的 允许,并且与应用程序一起上载的所有应用程序文件 可用
一种选择(成本更高)是使用灵活的环境,它没有这样的限制

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

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

要设置整个对象的格式,请使用Imagick::setFormat 方法。例如,加载TIFF文件,然后在Imagick上使用setFormat('pdf') 对象,然后写入图像文件('foo.pdf')或getImagesBlob()


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

1) 谷歌应用程序引擎标准的沙盒限制

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


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

对于任何面临相同问题的人,我通过创建一个新的谷歌计算引擎解决了我的问题,该引擎上安装了PHP,我创建了一个函数,使用Imagick将pdf转换为图像,它以base64流的形式返回响应


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

如果目录是“只读”的,或者换句话说,如果您没有权限这样做,您将无法在该目录中写入任何数据,1-设置正确的权限,或2-将您的拇指保存在另一个您有权限写入的目录中,3-将拇指存储在云中(一些API或任何其他外部存储)或4-将其保存到MYSQL之类的数据存储中(不是一个好选择)我无法更改添加写入的权限。。。。这在我的情况下是不允许的,我试图更改imagick的写入目录,但我无法实现…我尝试了您的解决方案,但很抱歉它引发了此错误,未捕获异常“ImagickException”,消息为“UnableToWriteBlob`magick--1lFkoxwYxJHF4”:顺便说一句,只读文件系统@error/blob.c/BlobToFile/266”。。。我可以成功地为jpg图像生成缩略图,问题只存在于pdf文件中…移动到flex环境不是我的选择。。。在这一行“$imagick->readimageblob($imagenblob);”抛出异常。。。。那是在设置格式之前。。。在过去的3天里,我试图将imagick配置为不使用中间/临时文件,但运气不好……如果有使用python的完整解决方案,我可以使用它,而不是使用它。我所能指出的是一种潜在的有用方法,即使用内存中的
StringIO
filehandler来避免写入文件系统:或者一个写入GCS文件的示例:我尝试了您的解决方案,并将thumbnailGenerator文件移到了Flex环境中。。。现在我面临以下错误“uncaughtimagickexception:Unable-readimageblob-in/app/thumpnailGenerator.php:31 Stack trace:#0/app/thumpnailGenerator.php(31):Imagick->readimageblob('%PDF-1.3\n%\xC7\xEC\x8F\xA2\n…)”显示引发该错误的代码吗?我想这是从你的GAE标准应用程序读取的GCS img(后处理缩略图)?