Closed naota7118 closed 2 months ago
Google API Clientの設定をonline
に修正したが、解決しなかった。
additional_parameters: {
'access_type' => 'online', # online access
'include_granted_scopes' => 'true' # incremental auth
}
developブランチで30人分でもエラーになった。 しかし今度はさっきとは違うエラー
E, [2024-08-10T08:26:59.024213 #1] ERROR -- : [d69d12ef-e1da-4eb9-a84b-f9a579895a59]
[d69d12ef-e1da-4eb9-a84b-f9a579895a59] Google::Apis::ClientError (fileIdInUse: A file already exists with the provided ID.):
このエラーは、失敗時にファイルが残ってしまうことが原因だとわかった。 残っていたファイルを消して実行したら解消した。
例外処理を書いたら成功した。
begin
converted_file = drive.copy_file(metadata.id, Google::Apis::DriveV3::File.new(mime_type: 'application/vnd.google-apps.document'))
rescue
#pdfファイルとexcelファイルを消す
File.delete(Rails.root.join('public/uploads/*.pdf').to_s)
File.delete(Rails.root.join('public/uploads/*.xlsx').to_s)
end
なぜ例外処理を書いたら成功したのか?
@drive = Google::Apis::DriveV3::DriveService.new.tap do |client|
client.request_options.retries = 5
end
何回かリトライが行われて、リトライが行われる時に、すでにファイルがあると以下のエラーになっていたから。
毎回例外が起きてもファイルが残らないようにしたことで解決した。
Google::Apis::ClientError (fileIdInUse: A file already exists with the provided ID.):
そんなファイルはないと言われた。
*.pdf
という名前のファイルを消そうとしているのでエラーになってしまう。
File.delete
は単一のファイルしか消せないので*
は使えない。
# before
File.delete(Rails.root.join('public/uploads/*.pdf').to_s)
File.delete(Rails.root.join('public/uploads/*.xlsx').to_s)
# after
FileUtils.rm_r(Dir.glob(Rails.root.join('public/uploads/*.xlsx').to_s))
FileUtils.rm_r(Dir.glob(Rails.root.join('public/uploads/*.pdf').to_s))
「APIリクエストが無効であるか、形式が正しくない」と言われる。