Skip to content

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

@Alexey1100

Description

@Alexey1100

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions