Php 如何将内容处置添加到预认证的Amazon S3链接

Php 如何将内容处置添加到预认证的Amazon S3链接,php,amazon-s3,Php,Amazon S3,我正在使用此代码创建一个经过身份验证的Amazon Url 是否有可能通过添加内容处置头让Amazon知道该文件需要强制下载?在收集了这个谜题的各个部分后,我能够创建这个Ruby方法,使用aws密钥对查询字符串url进行正确签名 我为此提供的资源: 另外,来自S3的响应也很有帮助,因为当我创建了一个带有错误签名的url时,响应显示了AWS S3通过解密我生成的url生成的字符串_到_的符号。经过几次迭代之后,我能够集中到字符串的正确格式上,在这之后,它是相当标准的东西 以下是Ruby方

我正在使用此代码创建一个经过身份验证的Amazon Url


是否有可能通过添加内容处置头让Amazon知道该文件需要强制下载?

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

我为此提供的资源:

另外,来自S3的响应也很有帮助,因为当我创建了一个带有错误签名的url时,响应显示了AWS S3通过解密我生成的url生成的字符串_到_的符号。经过几次迭代之后,我能够集中到字符串的正确格式上,在这之后,它是相当标准的东西

以下是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'})

用于PHP和Ruby的AWS SDK的当前版本都有方法参数,允许您在生成签名链接时指定content disposition标头

PHP:

  • 菲律宾:
响应-数组-可选-允许调整特定的响应标题。传递一个关联数组,其中每个键都是以下项之一:缓存控制、内容处置、内容编码、内容语言、内容类型、过期。

  • 红宝石:
Options hash::response\u content\u disposition(字符串)-在对返回的URL执行HTTP GET时设置响应的内容处置头


可能相关:这个问题确实是关系,但我想为每个请求添加标题,而不仅仅是每个文件。谢谢!解决方案确实是将响应头添加到文件名中(并使用它来计算签名)