6

我正在使用 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了 url,这似乎有效。这是雾的问题吗?还是我的标题不正确?

4

2 回答 2

11

我认为 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 不同的是,其中有一个额外的 headers 选项(您可以使用它来执行诸如 set 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)

希望这可以为您填补空白(如果是这样,如果这样做有意义,我们可以考虑更多关于在雾中修复该行为)。谢谢!

于 2014-01-30T21:43:32.513 回答
2

我建议您尝试使用bucket.files.create操作,而不是使用 *put_object_url* ,该操作采用 Fog 文件哈希属性并返回Fog::Storage::AWS::File

我更喜欢将其分解为更多步骤,这是一个示例:

fog_s3 = Fog::Storage.new({
   :provider                 => 'AWS',
   :aws_access_key_id        => key,
   :aws_secret_access_key    => secret
})

# Define the filename
ext = :wav
filename = "foo.#{ext.to_s}"

# Path to your audio file?
path ="/"

# Define your expiry in the amount of seconds
expiry = 1.day.to_i

#Initialize the bucket to store too
fog_bucket = connection.directories.get(bucket)

file = {
   :key => "#{filename}",
   :body => IO.read("#{path}#{filename}"),
   :content_type => Mime::Type.lookup_by_extension(ext),
   :cache_control => "public, max-age=#{expiry}",
   :expires => CGI.rfc1123_date(Time.now + expiry),
   :public => true
}

# Returns a Fog::Storage::AWS::File
file = fog_bucket.files.create( file )

# Now to retrieve the public_url
url = file.public_url

注意:对于子目录的结帐,AWS 存储桶的 :prefix 选项。

雾文件文档:可选属性...页面底部,:) http://rubydoc.info/gems/fog/Fog/Storage/AWS/File

希望该示例将有助于解释创建雾文件的步骤......干杯!:)

于 2014-02-10T05:15:52.763 回答