PHPのGoogle Drive APIでファイルを削除するとエラーになる問題の対処 - 2016.01.26

概要

Google提示のPHPサンプル通りに実装してみたら、Google Drive APIでファイルを削除するとエラーになってしまったので、原因と対処方法をメモリます。

サンプル

Google提示のサンプルは、以下のようになっている

/**
 * Remove a file from a folder.
 *
 * @param Google_Service_Drive $service Drive API service instance.
 * @param String $folderId ID of the folder to remove the file from.
 * @param String $fileId ID of the file to remove from the folder.
 */
function removeFileFromFolder($service, $folderId, $fileId) {
  try {
    $service->parents->delete($fileId, $folderId);
  } catch (Exception $e) {
    print "An error occurred: " . $e->getMessage();
  }
}

これを実行すると、例外が発生して以下のメッセージが出力された。
このとき、対象のファイルは削除されていたので、削除APIは成功したと考えられる。

An error occurred: HTTP Error: Unable to connect: 'fopen(compress.zlib://https://www.googleapis.com/drive/v2/files/XXXXXXXXXXXXXXXXXXXX/parents/YYYYYYYYYYYYYYYYYYY): failed to open stream: operation failed'

原因

APIのソースを確認すると、Google_Clientインスタンスにて、Google_Http_Requestのdisable_gzipがfalseとなっていたため、存在しないレスポンスデータを無理やりgzip圧縮していたようだと考えられる。

対処

削除APIの呼び出し前に、Google_Http_Requestのdisable_gzipにtrueを設定する。

  try {

    // 原状保存
    $disableGzip = $client->getClassConfig(
        "Google_Http_Request", 
        "disable_gzip");

    // Google_Http_Requestのdisable_gzipにtrueを設定
    $client->setClassConfig(
        "Google_Http_Request", 
        "disable_gzip",
        true);

    $service->parents->delete($fileId, $folderId);

    // 原状回復
    $client->setClassConfig(
        "Google_Http_Request", 
        "disable_gzip", 
        $disableGzip);

  } catch (Exception $e) {
    print "An error occurred: " . $e->getMessage();
  }

このように修正したところ、Exceptionの発生はなくなりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です