Как добавить Content-Disposition в предварительно авторизованную ссылку Amazon S3 - PullRequest
2 голосов
/ 09 ноября 2011

Я использую этот код для создания аутентифицированного URL-адреса Amazon http://developer.longtailvideo.com/trac/browser/testing/files/s3-generator.php

Можно ли как-то сообщить Amazon, что файл необходимо принудительно загрузить, добавив заголовок Content-Disposition?

Ответы [ 2 ]

4 голосов
/ 13 ноября 2011

Собрав отдельные фрагменты этой головоломки, я смог создать метод Ruby, который правильно подписывает URL строки запроса, используя секретный ключ aws.

Мои ресурсы для этого:

Кроме того, ответ от S3 был полезен, потому что когда яПри создании URL-адреса с неверной подписью в ответе было указано string_to_sign, сгенерированное AWS S3 в результате расшифровки сгенерированного URL-адреса.После нескольких итераций я смог сойтись на правильном форматировании 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'})
2 голосов
/ 03 сентября 2012

Текущие версии AWS SDK для PHP и Ruby имеют параметры методов, которые позволяют указывать заголовок размещения контента при создании подписанной ссылки.

PHP:

response - array - Необязательно - Позволяет корректировать определенные заголовки ответа. Передайте ассоциативный массив, в котором каждый ключ имеет одно из следующих значений: управление кэшем, размещение содержимого, кодирование содержимого, язык содержимого, тип содержимого, срок действия истекает.

Параметры hash:: response_content_disposition (String) - Устанавливает заголовок Content-Disposition ответа при выполнении HTTP GET для возвращенного URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...