【问题标题】:Paperclip how to change basename (filename)?Paperclip如何更改basename(文件名)?
【发布时间】:2012-03-07 18:07:08
【问题描述】:

我正在尝试更改照片的基本名称(文件名):

在我的模型中,我有:

  attr_accessor :image_url, :basename

  has_attached_file :image,
          :styles => { :original => ["300x250>", :png], :small => ["165x138>", :png] },
          :url  => "/images/lille/:style/:id/:basename.:extension",
          :path => ":rails_root/public/images/lille/:style/:id/:basename.:extension"
before_save :basename
private

  def basename
  self.basename = "HALLLO"
  end

但是文件名根本没有改变。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 paperclip


    【解决方案1】:

    如果您直接分配文件,您可以这样做:

    photo.image = the_file
    photo.image.instance_write(:file_name, "the_desired_filename.png")
    photo.save
    

    【讨论】:

      【解决方案2】:

      我这样做是为了去除空格:

      before_post_process :transliterate_file_name
      
      private
      def transliterate_file_name
        self.instance_variable_get(:@_paperclip_attachments).keys.each do |attachment|
          attachment_file_name = (attachment.to_s + '_file_name').to_sym
          if self.send(attachment_file_name)
            self.send(attachment).instance_write(:file_name, self.send(attachment_file_name).gsub(/ /,'_'))
          end
        end
      end
      

      希望对你有所帮助。

      编辑:

      在你的例子中:

      def basename
        self.image_file_name = "foobar"
      end
      

      应该做的工作。 (但可能会重命名该方法;))

      【讨论】:

        【解决方案3】:

        Paperclip 现在允许您在设置 has_attached_file 时传入 FilenameCleaner 对象。

        您的 FilenameCleaner 对象必须以文件名作为唯一参数来响应 call。如果在设置 has_attached_file 时提供了 restricted_characters 选项,默认的 FilenameCleaner 会删除无效字符。

        所以它看起来像:

        has_attached_file :image,
                          filename_cleaner: MyRandomFilenameCleaner.new
                          styles: { thumbnail: '100x100' }
        

        MyRandomFilenameCleaner 将是:

        class MyRandomFilenameCleaner
          def call(filename)
            extension = File.extname(filename).downcase
            "#{Digest::SHA1.hexdigest(filename + Time.current.to_s).slice(0..10)}#{extension}"
          end
        end
        

        您可以通过传递一个具有self.call 方法而不是对象的类而侥幸,但这符合 Attachment.rb 中 Paperclip 的文档。

        【讨论】:

          【解决方案4】:

          我想避免为每个带有附件的模型添加before_create 回调。我看了at the source,在写这篇文章的时候它看起来像:

          module Paperclip
            class Attachment
            ...
              def assign_file_information
                instance_write(:file_name, cleanup_filename(@file.original_filename))
                instance_write(:content_type, @file.content_type.to_s.strip)
                instance_write(:file_size, @file.size)
               end
          

          所以你可以修补cleanup_filename

          config/initializers/paperclip.rb

          module Paperclip
           class Attachment
             def cleanup_filename(filename)
               "HALLLO"
             end
            end
           end
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-11-07
            • 1970-01-01
            • 2016-08-09
            • 1970-01-01
            • 2014-01-18
            • 2017-05-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多