读写文件属性

时间:2014-10-08 15:53:17

标签: ruby-on-rails

在rails控制台中:

ActionDispatch::Http::UploadedFile.new tempfile: 'tempfilefoo', original_filename: 'filename_foo.jpg', content_type: 'content_type_foo', headers: 'headers_foo'
 => #<ActionDispatch::Http::UploadedFile:0x0000000548f3a0 @tempfile="tempfilefoo", @original_filename=nil, @content_type=nil, @headers=nil> 

我可以将字符串写入@tempfile,但@original_filename@content_type@headers仍为nil

为什么这样以及如何将信息写入这些属性?

我如何从文件实例中读取这些属性?

File.new('path/to/file.png')

2 个答案:

答案 0 :(得分:2)

以下内容可以帮助您:

upload = ActionDispatch::Http::UploadedFile.new({ 
    :tempfile => File.new("#{Rails.root}/relative_path/to/tempfilefoo") , #make sure this file exists
    :filename => "filename_foo" # use this instead of original_filename 
})
upload.headers = "headers_foo"
upload.content_type = "content_type_foo"

我不明白“我怎样才能从文件实例中读取这些属性?”,你究竟想做什么。 也许如果你想阅读tempfile,你可以使用:

upload.read # -> content of tempfile
upload.rewind # -> rewinds the pointer back so that you can read it again.

希望它有所帮助:)如果我误解了,请告诉我。

答案 1 :(得分:2)

没有记录(并没有多大意义),但看起来the options UploadedFile#initialize takes:tempfile:filename:type:head

def initialize(hash) # :nodoc:
  @tempfile          = hash[:tempfile]
  raise(ArgumentError, ':tempfile is required') unless @tempfile

  @original_filename = encode_filename(hash[:filename])
  @content_type      = hash[:type]
  @headers           = hash[:head]
end

将调用更改为:

ActionDispatch::Http::UploadedFile.new tempfile: 'tempfilefoo',
  filename: 'filename_foo.jpg', type: 'content_type_foo', head: 'headers_foo'

或者您可以在初始化后设置它们:

file = ActionDispatch::Http::UploadedFile.new tempfile: 'tempfilefoo', filename: 'filename_foo.jpg'
file.content_type = 'content_type_foo'
file.headers = 'headers_foo'

我不确定我理解你的第二个问题,“我怎样才能从文件实例中读取这些属性?”

您可以使用File.basename

从任何路径中提取文件名(或最后一个组件)
file = File.new('path/to/file.png')
File.basename(file.path) # => "file.png"

如果要获取与文件扩展名对应的Content-Type,可以使用Rails的Mime模块:

type = Mime["png"] # => #<Mime::Type:... @synonyms=[], @symbol=:png, @string="text/png">
type.to_s          # => "text/png"

您可以将其与File.extname放在一起,它会为您提供扩展程序:

ext = File.extname("path/to/file.png") # => ".png"
ext = ext.sub(/^\./, '') # => "png" (drop the leading dot)
Mime[ext].to_s           # => "text/png"

您可以通过在Rails控制台中键入Mime::SETlooking at the source来查看Rails知道的所有MIME类型的列表,还可以向您展示如何注册其他MIME类型以防万一期待其他类型的文件。