我正在使用Fog gem生成预签名网址.我可以成功完成此操作以获得对该文件的读取权限.这是我做的:
fog_s3 = Fog::Storage.new({ :provider => 'AWS', :aws_access_key_id => key, :aws_secret_access_key => secret }) object_path = 'foo.wav' expiry = Date.new(2014,2,1).to_time.to_i url = fog_s3.directories.new(:key => bucket).files.new(:key => object_path).url(expiry,path_style: true)
但是当我尝试上传文件时,这不起作用.有没有办法指定http动词,所以它将是一个PUT而不是GET?
编辑我看到一个方法:put_object_url
这可能会有所帮助.我不知道怎么访问它.
谢谢
根据您的建议编辑:
它有所帮助 - 它给了我一个PUT - 而不是GET.但是,我还有问题.我添加了内容类型:
headers = { "Content-Type" => "audio/wav" } options = { path_style: true } object_path = 'foo.wav' expiry = Date.new(2014,2,1).to_time.to_i url = fog_s3.put_object_url(bucket,object_path, expiry, headers, options)
但网址中不包含该网址Content-Type
.当从HTML中的Javascript完成时,我得到Content-Type
了网址,这似乎有效.这是雾的问题吗?或者我的标题不正确?
我认为put_object_url确实是你想要的.如果你按照url方法回到它定义的位置,你可以看到它使用类似于get_object_url的类似方法(https://github.com/fog/fog/blob/dc7c5e285a1a252031d3d1570cbf2289f7137ed0/lib/fog/aws/models /storage/files.rb#L83).您应该可以执行类似操作,并且可以通过从上面已创建的fog_s3对象调用此方法来执行此操作.它最终应该看起来像这样:
headers = {} options = { path_style: true } url = fog_s3.put_object_url(bucket, object_path, expires, headers, options)
请注意,与get_object_url不同的是,在那里有一个额外的标题选项snuck(你可以使用它来设置类似我认为的设置Content-Type).
希望能为您排序,但如果您有其他问题,请告诉我.谢谢!
附录
嗯,似乎可能存在与此相关的错误(我现在想知道这部分代码已被执行了多少).我认为你应该能够解决它(但我不确定).我怀疑你只能将选项中的值复制为查询参数.你能尝试这样的吗?
headers = query = { 'Content-Type' => 'audio/wav' } options = { path_style: true, query: query } url = fog_s3.put_object_url(bucket, object_path, expires, headers, options)
希望为你填补空白(如果是这样的话,我们可以考虑更多关于如果有意义的话,在雾中修复这种行为).谢谢!