naota7118 / ocr_check_app

0 stars 0 forks source link

60人分データの照合で生じたエラー #39

Closed naota7118 closed 2 months ago

naota7118 commented 3 months ago
スクリーンショット 2024-08-10 午後4 31 41

「APIリクエストが無効であるか、形式が正しくない」と言われる。

I, [2024-08-10T07:31:25.414028 #1]  INFO -- : [157dc969-cf36-4d64-ab47-15f6d8259d92] Completed 500 Internal Server Error in 6217ms (ActiveRecord: 0.0ms | Allocations: 71373)
E, [2024-08-10T07:31:25.415165 #1] ERROR -- : [157dc969-cf36-4d64-ab47-15f6d8259d92]   
[157dc969-cf36-4d64-ab47-15f6d8259d92] Google::Apis::ClientError (badRequest: Bad Request):
naota7118 commented 3 months ago

Google API Clientの設定をonlineに修正したが、解決しなかった。

additional_parameters: {
  'access_type' => 'online', # online access
  'include_granted_scopes' => 'true' # incremental auth
}
naota7118 commented 3 months ago

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.):

このエラーは、失敗時にファイルが残ってしまうことが原因だとわかった。 残っていたファイルを消して実行したら解消した。

naota7118 commented 2 months ago

エラー

スクリーンショット 2024-08-14 午後2 38 48

原因の推測

解決した方法

例外処理を書いたら成功した。

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.):
naota7118 commented 2 months ago

そんなファイルはないと言われた。

スクリーンショット 2024-08-14 午後5 36 45

*.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))