我正在使用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/

10-11 06:44