ActiveStorage raw file uploads fail with "An unknown file format not allowed" due filename being lost

オープン
#591 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
52/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
rails, ruby
領域
backend

調査の方向性

lib/active_storage/service/cloudinary_service.rb の upload メソッドから始め、ActiveStorage のファイル名が Cloudinary::Uploader.upload_large にどのように渡されるかを確認してください。issue に記載された設定済みの CSV アップロードを再現し、説明どおりに元のファイル名を保持して、ActiveStorage のアップロードが unknown file format エラーなしで完了することを確認してください。

索引モデルが issue の本文から書いたものです。

説明

Bug report for Cloudinary Ruby SDK

Before proceeding, please update to latest version and test if the issue persists

Describe the bug in a sentence or two.

When uploading raw files (e.g. CSV) through the ActiveStorage integration, the Cloudinary API rejects the upload with CloudinaryException: An unknown file format not allowed.

This is a regression from the 1.x series, which used rest-client and preserved the original filename in multipart requests.

Issue Type (Can be multiple)

  • Build - Cannot install or import the SDK
  • Performance - Performance issues
  • Behaviour - Functions are not working as expected (such as generate URL)
  • Documentation - Inconsistency between the docs and behaviour
  • Other (Specify)

Steps to reproduce

  1. Configure ActiveStorage with the Cloudinary service (config/storage.yml):
   cloudinary:
     service: Cloudinary
     type: private
  1. Configure a Cloudinary upload preset as the default for "API raw" with allowed_formats: ["csv"]
  2. Create a model with has_one_attached :csv_file
  3. Upload a .csv file through ActiveStorage
  4. Observe the error:
   ActiveStorage::IntegrityError (An unknown file format not allowed)
   Caused by: CloudinaryException (An unknown file format not allowed)

Error screenshots or Stack Trace (if applicable)

…

Operating System

  • Linux
  • Windows
  • macOS
  • All

Environment and Libraries (fill in the version numbers)

  • Cloudinary Ruby SDK version - 2.1.2
  • Ruby Version - 3.4.1
  • Rails Version - 8.1.2
  • Other Libraries (Carrierwave, ActiveStorage, etc) - 0.0.0

Repository

If possible, please provide a link to a reproducible repository that showcases the problem

Suggested Fix

In lib/active_storage/service/cloudinary_service.rb, the upload method should pass the filename to the uploader as original_filename:

def upload(key, io, filename: nil, checksum: nil, **options)
  instrument :upload, key: key, checksum: checksum do
    begin
      extra_headers = checksum.nil? ? {} : {Headers::CONTENT_MD5 => checksum}
      options = @options.merge(options)
      options[:original_filename] = filename.to_s if filename.present?  # <-- add this
      resource_type = resource_type(io, key)
      options[:format] = ext_for_file(key) if resource_type == "raw"
      Cloudinary::Uploader.upload_large(
        io,
        # ... rest unchanged
      )
    end
  end
end
主要言語
Ruby
スター
420
フォーク
282
PR マージ指標
30日以内にマージされた PR はありません

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

cloudinary/cloudinary_gem のほかの issue

cloudinary/cloudinary_gem の issue をすべて見る

似ている issue

Ruby の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。