Как автоматически очистить имена файлов ActiveStorage Blob при загрузке или перед загрузкой? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую ActiveStorage в большом приложении на Rails, и клиент, похоже, не может очистить свои имена файлов от небезопасных символов. Я не могу найти способ сделать это автоматически в самой структуре. Я бы предпочел не просто выводить очищенное имя файла, когда URL-адрес файла выводится во внешнем интерфейсе, так как это может сбить с толку других разработчиков при отладке проблем позже.

ActiveStorage::Blob.filename возвращает экземпляр Filename, который имеет sanitized метод, но я не вижу, где он на самом деле используется?

Blob :: filename: https://github.com/rails/rails/blob/master/activestorage/app/models/active_storage/blob.rb#L139

  # Returns an ActiveStorage::Filename instance of the filename that can be
  # queried for basename, extension, and a sanitized version of the filename
  # that's safe to use in URLs.
  def filename
    ActiveStorage::Filename.new(self[:filename])
  end

Имя файла: https://github.com/rails/rails/blob/master/activestorage/app/models/active_storage/filename.rb#L57

  # Returns the sanitized filename.
  #
  #   ActiveStorage::Filename.new("foo:bar.jpg").sanitized # => "foo-bar.jpg"
  #   ActiveStorage::Filename.new("foo/bar.jpg").sanitized # => "foo-bar.jpg"
  #
  # Characters considered unsafe for storage (e.g. \, $, and the RTL override character) are replaced with a dash.
  def sanitized
    @filename.encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "�").strip.tr("\u{202E}%$|:;/\t\r\n\\", "-")
  end

Документы Rails описывают, как attach файлы, однако это для отдельных файлов и не подходит, если клиент загружает несколько файлов в однажды:

https://edgeguides.rubyonrails.org/active_storage_overview.html#attaching -file-io-objects

Другой вопрос SO задает нечто подобное, но требует обновления записи, а не очистки при создании:

{ ссылка }

В другой средней статье предлагается добавить после сохранения в модель, но приложение использует несколько имен вложений для каждой модели и несколько моделей с вложениями, и снова это не будет подходящим решением :

https://medium.com/fiatinsight/how-to-change-a-filename-in-rails-active-storage-f3e4f26f427e

Я чувствую, что это должно быть довольно просто, однако это будет довольно проблематично.

Любая помощь будет оценили.

...