簡體   English   中英

App Engine PHP 生成圖像縮略圖

[英]App Engine PHP generate image thumb

我想使用imagick和 PHP 為存儲在谷歌存儲桶上的PDF 文件生成縮略圖
我在谷歌應用引擎(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 用來寫入的目錄,但我無法做到這一點!!

ImageMagick 需要一個臨時目錄來在委托解碼/編碼過程中寫入工件。 我不熟悉 ,但文件建議應使用tempnam()sys_get_temp_dir()

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

另請注意,ImageMagick 使用 Ghostscript 進行 PDF 解碼。 如果使用 PDF 文件工作,請驗證gs二進制文件是否已安裝和可用。

您遇到了標准環境沙箱限制之一

App Engine 應用程序不能:

  • 寫入文件系統。 PHP 應用程序可以使用Google Cloud Storage來存儲持久性文件。 允許從文件系統讀取,並且所有與應用程序一起上傳的應用程序文件都可用。

一種選擇(成本更高)是使用沒有此類限制的靈活環境。

另一種方法是嘗試將imagick配置為不使用中間/臨時文件(不知道它是否支持)或使用內存文件模擬(如果 PHP 支持,則不要,我是 python 用戶)並通過Imagick::setFilename

嘗試將使用另一件事setFormat而不是setImageFormat ,在音符setImageFormat表明,有可能使/前的轉換,而無需編寫的文件:

要設置整個對象的格式,請使用 Imagick::setFormat 方法。 例如,加載 TIFF 文件,然后在 Imagick 對象上使用 setFormat('pdf'),然后使用 writeImagesFile('foo.pdf') 或 getImagesBlob()。

由於兩種相反的力量在起作用,沒有真正的方法可以使這項工作發揮作用:

1) Google App Engine Standard 的沙盒限制

2)Imagick 顯然需要本地文件系統訪問(至少暫時)才能工作。

因此,如果您無法改變 Imagick 的工作方式,那么剩下的唯一解決方案就是不使用 GAE 標准。 您可以使用 GAE Flex 或 Google Compute Engine。 我不知道為什么 Flex 不適合您; 你不需要移動整個項目。 您可以將這部分移植為同一項目中 GAE Flex 上的微服務 該服務的唯一功能是處理圖像並獲取縮略圖。 然后,您可以將縮略圖放在 Google Cloud Storage 存儲分區中,供您的應用程序的其余部分(在 GAE 標准中)使用。

對於面臨同樣問題的任何人,我通過創建一個新的 Google Compute Engine 解決了我的問題,並在其上安裝了 PHP,我創建了一個函數來使用 Imagick 將 pdf 轉換為圖像,並將響應作為 base64 流返回。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM