如何将Content-Disposition添加到预先认证的Amazon S3链接

时间:2011-11-09 09:16:21

标签: php amazon-s3

我正在使用此代码创建经过身份验证的Amazon Url http://developer.longtailvideo.com/trac/browser/testing/files/s3-generator.php

是否有可能以某种方式让亚马逊知道需要通过添加Content-Disposition标头来强制下载该文件?

2 个答案:

答案 0 :(得分:4)

在收集了这个拼图的各个部分后,我能够创建这个Ruby方法,使用aws密钥正确签名查询字符串url。

我的资源:

此外,从S3返回的响应很有帮助,因为当我创建一个带有错误签名的URL时,响应显示了AWS S3通过解密我生成的URL生成的string_to_sign。经过几次迭代后,我能够收集到string_to_sign的正确格式,之后就是非常标准的东西了。

这是Ruby方法:

##############################################################################
# Create a signed query-string URL that supports setting response headers
##############################################################################
def s3_signed_url(bucket, pathname, verb, content_md5=nil, content_type=nil, response_headers = {})
  expires = Time.now + 5.minutes
  response_headers_canonicalized = response_headers.sort_by{|key, value| key.downcase}.collect{|key, value| "#{key}=#{value}"}.join("&").to_s
  string_to_sign = "#{verb.upcase}\n#{content_md5}\n#{content_type}\n#{expires.to_i}\n/#{bucket}/#{pathname}?#{response_headers_canonicalized}"

    digest = OpenSSL::Digest::Digest.new('sha1')
  hmac = OpenSSL::HMAC.digest(digest, aws_secret_key, string_to_sign)
  signature = Base64.encode64(hmac).chomp
  url = "http://s3.amazonaws.com/#{bucket}/#{pathname}?"
  if response_headers.count > 0
    response_headers.each do |key, value|
      url += "#{key}=#{value}&"
    end
  end
  url += "AWSAccessKeyId=#{aws_access_key}&Expires=#{expires.to_i}&Signature=#{CGI.escape(signature)}";
  return url
end

你打电话给这样的方法:

file_url_s3 = s3_signed_url(file_bucket, file_path, 'GET', nil, nil, {'response-content-disposition' => 'attachment'})

答案 1 :(得分:2)

用于PHP和Ruby的AWS SDK的当前版本具有方法参数,允许您在生成签名链接时指定内容处置标题。

PHP:

  

response - array - 可选 - 允许调整特定的响应标头。传递关联数组,其中每个键都是以下之一:缓存控制,内容处置,内容编码,内容语言,内容类型,到期。在

  

Options hash :: response_content_disposition(String) - 在返回的URL上执行HTTP GET时设置响应的Content-Disposition标头。