Я использую 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
Я чувствую, что это должно быть довольно просто, однако это будет довольно проблематично.
Любая помощь будет оценили.