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

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

ただいまの
回答率

90.36%

  • PHP

    22369questions

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

  • CakePHP

    2446questions

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

  • AWS(Amazon Web Services)

    2322questions

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

  • ImageMagick

    107questions

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

  • imagick

    9questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,245

CyberMergina

score 275

前提・実現したいこと

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

private function _createThumnail($fileName){
    $thumbname = "thumb_".pathinfo($fileName, PATHINFO_FILENAME).".jpg";     //サムネイルのファイル名
    /* 画像の読み込み */
    $thumbImg = new Imagick();

    /* サムネイルの作成 */
    $thumbImg->readImage(AWS_S3_HOSTNAME.AWS_S3_BUCKET."/xxxx/".$fileName);
    $ret = $this->Amazon->putObject($thumbname, $thumbImg);
    $thumbImg->thumbnailImage(100, 0);
    $thumbImg->setImageFormat ("jpeg");
    try {
      $thumbImg->writeImage(AWS_S3_HOSTNAME.AWS_S3_BUCKET."/xxxx/".$thumbname);
    } catch (Exception $e) {
      pr($e); // ここにきてます
    }
    exit();
    $thumbImg->clear();
     return $thumbname;
  }

AmazonComponent.php

function putObject($key, $file){
    try {
      $credentials = new Credentials(AWS_S3_KEY, AWS_S3_SECURITY);
      $aws = S3Client::factory([
        'version'    => AWS_S3_VERSION,
        'credentials' => $credentials,
        'region' => AWS_S3_REGION,
      ]);
      $result = $aws->putObject([
        'Bucket' => AWS_S3_BUCKET,
        'Key'    => $key,
        'SourceFile'   => $file,
        'StorageClass' => AWS_S3_STORAGE,
      ]);
      return $result['ObjectURL'];
    } catch (Exception $e) {
      return "";
    }
  }

試したこと

  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でアップするように、ソースコードを下記の通り変更してみました。

private function _createThumnail($fileName){
    $thumbname = "thumb_".pathinfo($fileName, PATHINFO_FILENAME).".jpg";     //サムネイルのファイル名
    /* 画像の読み込み */
    $thumbImg = new Imagick();
    /* サムネイルの作成 */
    $thumbImg->readImage(AWS_S3_HOSTNAME.AWS_S3_BUCKET."/xxxx/".$fileName);
    $thumbImg->thumbnailImage(100, 0);
    $thumbImg->setImageFormat ("jpeg");
    try {
      $ret = $this->Amazon->putObject("xxxx/".$thumbname, $thumbImg->getImageBlob());
    } catch (Exception $e) {
    }
    $thumbImg->clear();
    return $ret;
  }

ハッシュの形式が違う?とかでファイルが開けないと怒られました・・・。

A 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.

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • popobot

    2016/12/13 07:17 編集

    切り分けとして、writeImageでローカルに書き込むことはできるのでしょうか。

    そもそもwriteImageで直接パスを渡しているように見えますが、putObjectとかじゃないとアップできないということはないですかね...(s3cmdぐらいしか使ったことないので参考程度に)

    キャンセル

  • CyberMergina

    2016/12/13 09:40 編集

    どこかのサイトを参考にさせて頂いてた気がするのですが、改めて調べてみると出来なさそうですね・・・!(http://stackoverflow.com/questions/11286222/php-imagick-write-image-directly-to-amazon-s3)試してみます!

    キャンセル

回答 2

check解決した方法

0

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

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

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

詳細まとめました。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/13 09:45

    ご回答ありがとうございます!
    念のため、サーバーの時刻を確認しましたが日本時間になっております。(S3は東京リージョンを使用しています)

    S3へのアップを行うときはサーバーとの時刻差異を気にする必要がある、
    というのは初めて知りました!ありがとうございます!

    キャンセル

同じタグがついた質問を見る

  • PHP

    22369questions

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

  • CakePHP

    2446questions

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

  • AWS(Amazon Web Services)

    2322questions

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

  • ImageMagick

    107questions

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

  • imagick

    9questions

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

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