在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')
答案 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::SET
或looking at the source来查看Rails知道的所有MIME类型的列表,还可以向您展示如何注册其他MIME类型以防万一期待其他类型的文件。