我正在使用Fog和Amazon s3来管理视频和图像文件。在设置文件的content_type时,我遇到了很多问题。
当在控制台上工作时,我可以逐个更新每个文件的content_type,然后运行保存操作。但是,当我尝试在特定目录中更新所有文件时,没有出现错误,但是没有任何更新。我运行了多种不同的方法,所有方法的基本思想都相同,并且都设置为在文件保存时打印“saved!”。这些方法正常运行并打印出“saved!”,但是当我回去检查文件时,发现content_type仍然为空。
以下是我的一个示例:
此外,当我逐个更新每个文件时,保存工作正常,并且 content_type 得到了更新,但数据并没有持久化。例如:
然而,当我在AWS中检查文件时,内容类型仍为空。
有没有更好(持久)的方法来更新Fog s3文件上的content_type?我觉得我一定是走错了路。
更新: 尝试使用file#copy方法:
我收到了一个错误提示:
当在控制台上工作时,我可以逐个更新每个文件的content_type,然后运行保存操作。但是,当我尝试在特定目录中更新所有文件时,没有出现错误,但是没有任何更新。我运行了多种不同的方法,所有方法的基本思想都相同,并且都设置为在文件保存时打印“saved!”。这些方法正常运行并打印出“saved!”,但是当我回去检查文件时,发现content_type仍然为空。
以下是我的一个示例:
directory.files.each do |f|
case f.key.split(".").last
when "jpg"
f.content_type = "image/jpeg"
puts "saved!" if f.save
when "mov"
f.content_type = "video/quicktime"
puts "saved!" if f.save
end
end
此外,当我逐个更新每个文件时,保存工作正常,并且 content_type 得到了更新,但数据并没有持久化。例如:
file = directory.files.first
file.content_type = 'video/quicktime'
file.save # returns true
file.content_type # returns 'video/quicktime'
然而,当我在AWS中检查文件时,内容类型仍为空。
有没有更好(持久)的方法来更新Fog s3文件上的content_type?我觉得我一定是走错了路。
更新: 尝试使用file#copy方法:
directory.files.each do |f|
content_type = case f.key.split(".").last
when "jpg"
"image/jpeg"
when "mov"
"video/quicktime"
end
puts "copied!" if f.copy(f.directory.key, f.key, { 'Content-Type' => content_type })
end
我收到了一个错误提示:
Excon::Errors::BadRequest: Expected(200) <=> Actual(400 Bad Request)
from /Users/marybethlee/.rvm/gems/ruby-2.0.0-p0@mothership/gems/excon-0.22.1/lib/excon/middlewares/expects.rb:6:in `response_call'
from /Users/marybethlee/.rvm/gems/ruby-2.0.0-p0@mothership/gems/excon-0.22.1/lib/excon/connection.rb:355:in `response'
from /Users/marybethlee/.rvm/gems/ruby-2.0.0-p0@mothership/gems/excon-0.22.1/lib/excon/connection.rb:249:in `request'
from /Users/marybethlee/.rvm/gems/ruby-2.0.0-p0@mothership/gems/fog-1.11.1/lib/fog/core/connection.rb:21:in `request'
from /Users/marybethlee/.rvm/gems/ruby-2.0.0-p0@mothership/gems/fog-1.11.1/lib/fog/aws/storage.rb:506:in `request'
from /Users/marybethlee/.rvm/gems/ruby-2.0.0-p0@mothership/gems/fog-1.11.1/lib/fog/aws/requests/storage/copy_object.rb:33:in `copy_object'
from /Users/marybethlee/.rvm/gems/ruby-2.0.0-p0@mothership/gems/fog-1.11.1/lib/fog/aws/models/storage/file.rb:93:in `copy'
from (irb):14
from /Users/marybethlee/.rvm/rubies/ruby-2.0.0-p0/bin/irb:16:in `<main>'
Excon::Errors::BadRequest: Expected(200) <=> Actual(400 Bad Request)
我会编辑我的原始帖子,包括这个错误以及我所说的单独更新的示例。 - oolongfiles.all.each {|file| file.content_type}
还是files.get(key).content_type
或者其他操作?只是想确保我知道那边的情况(因为它可能在S3上设置了但在客户端上没有正确更新/显示)。特别是当执行files.all
时,默认情况下不包括此信息。 - geemusdirectory.files.first.content_type
,会返回 nil。但是如果我将同一个文件的 key 传递给directory.files.get(key).content_type
,它会返回"video/quicktime"
。这是 S3 相关的问题吗,还是根本不是问题?既然知道了发生了什么,我现在可以处理它了。 - oolong