###前提・実現したいこと
CentOS6.7の環境にCakePHPで管理画面を作っており、
資料を管理する画面を作成しております。
HTMLのFileタグにセットされたものをController側で取得、
そのままPDFの1ページ目をJPEG変換しS3に保存したいのですが
詳細なエラーメッセージも出ずに困っております。。。
※ PDFをS3に保存することは出来ております。
S3への保存はAWS SDK for PHPを使っており
画像の変換にはImageMagick,imagick,jpegsrc.v8c等をインストールしております。
###発生している問題・エラーメッセージ
ImagickException Object ( [message:protected] => not authorized `https://s3-ap-northeast-1.amazonaws.com/xxxx.xxxx.jp/xxxx/thumb_xxxxxxxxxxxxxxx.jpg' @ error/constitute.c/WriteImage/1060 ...
###該当のソースコード
DocumentController.php
php
1 2 private function _createThumnail($fileName){ 3 $thumbname = "thumb_".pathinfo($fileName, PATHINFO_FILENAME).".jpg"; //サムネイルのファイル名 4 /* 画像の読み込み */ 5 $thumbImg = new Imagick(); 6 7 /* サムネイルの作成 */ 8 $thumbImg->readImage(AWS_S3_HOSTNAME.AWS_S3_BUCKET."/xxxx/".$fileName); 9 $ret = $this->Amazon->putObject($thumbname, $thumbImg); 10 $thumbImg->thumbnailImage(100, 0); 11 $thumbImg->setImageFormat ("jpeg"); 12 try { 13 $thumbImg->writeImage(AWS_S3_HOSTNAME.AWS_S3_BUCKET."/xxxx/".$thumbname); 14 } catch (Exception $e) { 15 pr($e); // ここにきてます 16 } 17 exit(); 18 $thumbImg->clear(); 19 return $thumbname; 20 }
AmazonComponent.php
php
1 function putObject($key, $file){ 2 try { 3 $credentials = new Credentials(AWS_S3_KEY, AWS_S3_SECURITY); 4 $aws = S3Client::factory([ 5 'version' => AWS_S3_VERSION, 6 'credentials' => $credentials, 7 'region' => AWS_S3_REGION, 8 ]); 9 $result = $aws->putObject([ 10 'Bucket' => AWS_S3_BUCKET, 11 'Key' => $key, 12 'SourceFile' => $file, 13 'StorageClass' => AWS_S3_STORAGE, 14 ]); 15 return $result['ObjectURL']; 16 } catch (Exception $e) { 17 return ""; 18 } 19 }
###試したこと
error/constitute.c/WriteImage/1060
でググってみると、幾つかページを見つけましたが、
未だ回答には至っておりません。
(ここでjpegsrcをインストールしました)
- CLI上でPDF->PNGへの置換には成功しております
- システム上でPDF->PNGへの置換、アップは出来ておりません
- こちらのように、表示させるだけなら成功しました。
(ファイルとしての保存が出来ていない?)
- try...catch を入れないと下記のようなエラーが出ます
Fatal error: Uncaught exception 'FatalErrorException' with message ' in /var/www/xxxx/xxxx_site/lib/Cake/Error/ErrorHandler.php on line 138 ( ! ) FatalErrorException: [CakeException] Unknown status code #0 /var/www/xxxx/xxxx_site/lib/Cake/Error/ExceptionRenderer.php(225): CakeResponse->statusCode(499) #1 [internal function]: ExceptionRenderer->error400(Object(ImagickException)) #2 /var/www/xxxx/xxxx_site/lib/Cake/Error/ExceptionRenderer.php(187): call_user_func_array(Array, Array) #3 /var/www/xxxx/xxxx_site/lib/Cake/Error/ErrorHandler.php(127): ExceptionRenderer->render() #4 [internal function]: ErrorHandler::handleException(Object(ImagickException)) #5 {main} in /var/www/xxxx/xxxx_site/lib/Cake/Error/ErrorHandler.php on line 138 Call Stack # Time Memory Function Location 1 3.1805 4366368 ErrorHandler::handleException( ) .../ErrorHandler.php:0 2 3.2308 4473304 trigger_error ( ) .../ErrorHandler.php:138 3 3.2308 4475704 ErrorHandler::handleError( ) .../ErrorHandler.php:138 4 3.2309 4476408 ErrorHandler::handleFatalError( ) .../ErrorHandler.php:213
###補足情報(言語/FW/ツール等のバージョンなど)
CentOS6.7
CakePHP2系
S3
ImageMagick(imagick)
以上です。
足りない情報等あれば、随時追記させて頂きますので
ご教授の程よろしくお願い致します。
###追記1
putObjectでアップするように、ソースコードを下記の通り変更してみました。
php
1 private function _createThumnail($fileName){ 2 $thumbname = "thumb_".pathinfo($fileName, PATHINFO_FILENAME).".jpg"; //サムネイルのファイル名 3 /* 画像の読み込み */ 4 $thumbImg = new Imagick(); 5 /* サムネイルの作成 */ 6 $thumbImg->readImage(AWS_S3_HOSTNAME.AWS_S3_BUCKET."/xxxx/".$fileName); 7 $thumbImg->thumbnailImage(100, 0); 8 $thumbImg->setImageFormat ("jpeg"); 9 try { 10 $ret = $this->Amazon->putObject("xxxx/".$thumbname, $thumbImg->getImageBlob()); 11 } catch (Exception $e) { 12 } 13 $thumbImg->clear(); 14 return $ret; 15 }
ハッシュの形式が違う?とかでファイルが開けないと怒られました・・・。
php
1A sha256 checksum could not be calculated for the provided upload body, because it was not seekable. To prevent this error you can either 1) include the ContentMD5 or ContentSHA256 parameters with your request, 2) use a seekable stream for the body, or 3) wrap the non-seekable stream in a GuzzleHttp\Psr7\CachingStream object. You should be careful though and remember that the CachingStream utilizes PHP temp streams. This means that the stream will be temporarily stored on the local disk. 2
一旦ファイルを生成してからアップする方が良いみたいですかね・・・
回答2件
あなたの回答
tips
プレビュー