【问题标题】:Rails 3 - Tempfile Path?Rails 3 - 临时文件路径?
【发布时间】:2010-12-05 03:15:55
【问题描述】:

我有以下几点:

attachments.each do |a|
   Rails.logger.info a.filename
   tempfile = Tempfile.new("#{a.filename}", "#{Rails.root.to_s}/tmp/")
   Rails.logger.info tempfile.path
end

附件来自回形针。

输出如下:

billgates.jpg
/Users/bhellman/Sites/cline/tmp/billgates.jpg20101204-17402-of0u9o-0

为什么文件名最后会附加20101204-17402-of0u9o-0?那是用回形针等破坏一切。有人见过吗?我这辈子都不知道这是怎么回事?

谢谢

更新 回形针:Paperclip on github

a是附件

tempfile = Tempfile.new("#{a.filename}", "#{Rails.root.to_s}/tmp/")
tempfile << a.body
tempfile.puts
attachments.build(
    :attachment => File.open(tempfile.path)
)

【问题讨论】:

  • 为什么不直接使用 File.new 而不是 Tempfile.new?
  • 好问题。它需要对 Heroku 友好,并且他们的文档说要使用 tempfile?
  • 如果发生冲突,File.New 不会中断吗?

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


【解决方案1】:

最好确保您的临时文件具有正确的扩展名,以免您在尝试之后更改它:

file = Tempfile.new(['hello', '.jpg'])

file.path # => 类似:“/tmp/hello2843-8392-92849382--0.jpg”

更多:http://apidock.com/ruby/v1_9_3_125/Tempfile/new/class

【讨论】:

    【解决方案2】:

    Tempfile.new 的第一个参数只是一个基本名称。为了确保每个 Tempfile 都是唯一的,字符被附加到文件的末尾。

    【讨论】:

    • 谢谢约翰,但那会破坏回形针,然后它会执行 :attachment => File.open(tempfile.path),如何在没有附加到文件名的所有随机性的情况下将此临时文件发送到回形针?谢谢
    • 我不确定你想用回形针做什么。您是否尝试更改默认路径?
    • 这是我现在在 Paperclip 中的内容: :attachment => File.open(tempfile.path),问题是回形针在将文件上传到 s3 时使用临时文件名。因此,在发送到回形针之前,需要清理/更正文件名。
    • 你能发送回形针临时文件数据并告诉它要使用的文件名吗?像这样::attachment => send_data File.open(tempfile.path), :filename => "thefile.extttt"
    • 你能把代码贴在你使用 :attachment 选项的地方吗?我不熟悉这个选项。
    【解决方案3】:

    您应该为此使用 Paperclip 的 API:

    tempfiles = []
    attachments.each do |a|
      # use Attachment#to_file to get a :filesystem => file, :s3 => tempfile
      tempfiles << a.to_file
    end
    
    tempfiles.each do |tf|
      Rails.logger.debug tf.filename
    end
    

    【讨论】:

    • 我不明白上述建议有什么变化?正在采取什么措施来避免 Tempfile 给出的疯狂随机文件名?
    • 我认为您的问题是,当您从存储中提取文件时,临时文件的文件名很奇怪。
    • 我创建了一个临时文件,然后将其发送到回形针以通过 (:attachment => File.open(tempfile.path) 保存附件,回形针从临时文件中获取文件名。那就是问题,因为当时的文件名来自 tempfile. 在它的末尾有所有的随机性
    • 问题,将临时文件发送到回形针以一种没有疯狂文件名的方式保存,而是原始文件名,因此回形针将其正确保存在 S3 上。这有帮助吗?
    【解决方案4】:
    attachment = attachments.build(
      :attachment => File.open(tempfile.path)
    )
    
    # change the displayed file name stored in the db record here
    attachment.attachment_file_name = a.filename # or whatever else you like
    
    attachment.save!
    

    【讨论】:

    • 试过了,但问题是 S3 上的文件名没有更新。只是数据库中的文件名,这实际上会使链接无效,丢失文件。
    • 要么在保存记录之前更改文件名,要么不将临时文件中的文件名包含在 S3 看到的文件名中。
    【解决方案5】:

    我发现处理此问题的最佳方法是在 Paperclip 属性中指定文件扩展名。例如:

    has_attached_file :picture,
      :url => "/system/:hash.jpg",
      :hash_secret => "long_secret_string",
      :storage => :s3,
      :s3_credentials => "#{Rails.root}/config/s3.yml"
    

    注意 :url 被声明为 '.jpg' 而不是传统的 .:extension

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2013-10-08
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多