はじめに
複数のファイル形式(PDF、Excel、Word など)を一括でテキストデータ化しようとする際、CloudConvert と PHP スクリプトを組み合わせた運用が便利なケースがあります。ところが実際に運用を進めると、各種ログに示されるエラーや未対応の拡張子の取り扱いなど、想定外の問題が発生することがあるようです。
たとえば、職務経歴書や履歴書のアップロードファイルを取りまとめてテキスト化し、データベースへ保存するスクリプトを組んだ場合に、以下のようなログが出力されるケースがあります。
CloudConvert error: Call to undefined method stdClass::getUrl()
これが発生すると、データベースには “No Valid Data” として登録され、実際のテキスト変換が成功していない状態になります。本記事では、この現象が起きる理由と対策を中心に、スクリプト全体の流れやログ解析のポイントについてまとめます。
スクリプトの主な概要
今回対象となる PHP スクリプトは、主に以下のような流れを想定しています。
- ロックファイルのチェック
- マルチプロセスでの実行を避けるために、
.lock
ファイルを作成して排他制御を行います。
- マルチプロセスでの実行を避けるために、
- DB 接続
- PDO を用いて MySQL データベースに接続。
- 対象ユーザを抽出
careersite_users
テーブルから、shokumu_path
やrireki_path
が存在するのにshokumu_text
やrireki_text
が空になっているレコードを取得。
- 職務経歴書・履歴書ファイルのパスをもとに、実際のファイルを読み込み、テキスト化
.doc
/.docx
や.xls
/.xlsx
、.pdf
、.txt
などを対象とし、許可されていない拡張子(例:.odt
)は “No Valid File” として扱う。.zip
の場合は解凍し、中身に含まれている有効ファイルを探して変換を試みる。
- 変換結果のテキストを DB に保存
- 変換失敗なら “No Valid Data” として記録し、成功すればテキスト全文を保存する。
こうした一連の処理のなかで、CloudConvert を呼び出して PDF や Word ファイルのテキスト化を行う段階で問題が起きることがあります。
主なエラー事例
1. 「Call to undefined method stdClass::getUrl()」エラー
ログには以下のような文言が残っています。
CloudConvert error: Call to undefined method stdClass::getUrl()
このエラーは、CloudConvert からエクスポートした結果を表すオブジェクトが、stdClass
として戻ってきているにもかかわらず、コード側で getUrl()
というメソッドを呼び出そうとしたために発生します。近年の CloudConvert PHP ライブラリでは、エクスポートファイルの URL は単純に ->url
プロパティ(変数)で取得できる仕組みになっている場合が多いです。しかし古いバージョンやサンプルコードによっては、かつて getUrl()
のようなメソッドを呼んでいた例もあり、整合性が取れていないとこのようなエラーになります。
たとえば下記のようなコードで Undefined method
を回避可能です。
// (エラーになる例:)
// $fileUrl = $exportFile->getUrl();
// (修正後:)
$fileUrl = $exportFile->url; // stdClass が保持している「url」プロパティ
$content = file_get_contents($fileUrl);
もし、このエラーがトリガーされると、スクリプト側では「変換に失敗した」と認識し、データベースに “No Valid Data” を書き込む処理が走ります。実際は変換可能なファイルでも、結果を取得できないために失敗扱いとなる点が注意です。
2. 「Unsupported extension: odt」
スクリプトには、許可拡張子のリストが以下のように定義されている場合があります:
$allowed = ['doc','docx','txt','pdf','numbers','xlsx','xls'];
ここに .odt
は含まれていないため、履歴書や職務経歴書が .odt
(LibreOffice Writer)形式だった場合、ログには
Unsupported extension: odt
と出力され、そのまま “No Valid File” として扱われます。
もし .odt
を取り込みたい場合は、CloudConvert 側が odt -> txt
をサポートしているか確認のうえ、上記のリストや処理を拡張する必要があります。
3. .txt
ファイルの扱いと “No Valid Data”
.txt
の場合、CloudConvert を呼ばずに直接 file_get_contents()
で読み込んだあとに文字コードを調整するだけでテキスト化が完結します。しかしもしファイル自体が空だったり、文字化けなどで中身が正しく取得できないと、変換エラーとして “No Valid Data” となることがあります。
スクリプトのログを丁寧に追い、ファイルサイズや文字コードの状態を確認する必要があります。実際のテキストが短すぎる場合や読み込み時にエラーがあった場合も同様に “No Valid Data” として扱われる可能性があります。
対策とポイント
- CloudConvert API を呼ぶ際のメソッドを最新バージョンに合わせる
getUrl()
ではなく->url
で URL を取得するなど、ライブラリの仕様に準拠した書き方に修正する。
- 拡張子リストの再確認
.odt
を扱いたい場合は、対応する処理を明示的に追加。- 不要な拡張子への変換リクエストをそもそも投げないようにすることで、不要なエラーが減る。
- 例外のハンドリング方法
- CloudConvert で想定外の形式を指定した場合、ライブラリが
INVALID_CONVERSION_TYPE
を返す可能性もある。 - 返却値やエラー状況を確認し、“No Valid Data” と “No Valid File” を使い分ける。
- CloudConvert で想定外の形式を指定した場合、ライブラリが
- テキストファイル読み込み時のバリデーション
- ファイルサイズが極端に小さい場合や文字コードが想定外だった場合の挙動を調整する。
- ログ出力をさらに詳細化
- どのファイルでどの拡張子の処理が走ったか、CloudConvert に送信する前のステップは成功したか、などを詳細に記録することで原因を迅速に特定できる。
参考リンク
- [CloudConvert 公式サイト](https://cloudconvert.com “CloudConvert公式サイト” target=”_blank” rel=”nofollow”)
まとめ
PHP スクリプトで多様なファイル形式をテキスト化する際、CloudConvert を利用すると PDF や Word などの変換が一括で行えて非常に便利です。しかし、ライブラリのバージョン違いによるメソッド呼び出しの相違や、未対応拡張子の扱いなどで、DB に正しい情報が記録されず “No Valid Data” や “No Valid File” として保存されてしまう問題が起こります。
最も多いケースである「Undefined method stdClass::getUrl()
」は、実装で ->url
プロパティを使う形に修正することですぐに解決できる可能性が高いです。今後、拡張子を追加する際には、CloudConvert の対応状況を確かめながら処理を設計することが大切です。
(この文章の一部はAIで生成されています)