質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

imagick

IMagickは、PHPからImageMagickを使う場合に使用する拡張インターフェースです。PHPで簡単にImageMagickの機能が利用できます。

Q&A

解決済

2回答

5449閲覧

【AWS-S3×ImageMagick(imagick)】アップロードされたPDFをPDFとして保存し、1ページ目をサムネイル(jpeg)として保存したい

CyberMergina

総合スコア295

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

imagick

IMagickは、PHPからImageMagickを使う場合に使用する拡張インターフェースです。PHPで簡単にImageMagickの機能が利用できます。

0グッド

0クリップ

投稿2016/12/12 09:49

編集2016/12/13 02:59

###前提・実現したいこと
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

一旦ファイルを生成してからアップする方が良いみたいですかね・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2016/12/12 22:51 編集

切り分けとして、writeImageでローカルに書き込むことはできるのでしょうか。 そもそもwriteImageで直接パスを渡しているように見えますが、putObjectとかじゃないとアップできないということはないですかね...(s3cmdぐらいしか使ったことないので参考程度に)
guest

回答2

0

自己解決

解決、というよりは代替案で落ち着きました。

処理としては下記の通りです

  1. PDFをimagickで読み取る
  2. 最初のページをJPGに変換
  3. webroot/files/tmp直下にファイルとして保存
  4. 3で作成したファイルをS3にAWS-SDKでアップロード
  5. 3で作成したファイルを削除

詳細まとめました。

ご助言頂き、ありがとうございました。
クローズさせて頂きます。

投稿2016/12/13 06:01

編集2016/12/13 06:42
CyberMergina

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

検討違いでしたらスミマセン。
AWS-CLIを使ってS3にUpする際に、UPするマシンの時刻とUPするS3のリージョンの時刻が(ある程度)一致していないとS3側から拒否されます。
AWS SDK for PHPの仕様は全然調べておらず見当違いかも知れませんが
PHPを動作させているWEBサーバの時計(時刻)を確認してみては如何でしょうか?

投稿2016/12/12 15:18

odataiki

総合スコア938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CyberMergina

2016/12/13 00:45

ご回答ありがとうございます! 念のため、サーバーの時刻を確認しましたが日本時間になっております。(S3は東京リージョンを使用しています) S3へのアップを行うときはサーバーとの時刻差異を気にする必要がある、 というのは初めて知りました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問