我正在使用Fog gem生成预签名的URL。我可以成功完成此操作以获得对该文件的读取访问权限。这是我的工作:
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不同,那里有一个额外的 header 选项(您可以用来做诸如设置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)
希望这可以为您填补空白(如果可以的话,如果可以的话,我们可以考虑在雾中修复该行为)。谢谢!
关于ruby - 结合使用Fog和Ruby生成预签名URL,以在Amazon S3中放置文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21461143/