Позволяет пользователю загружать файл из хранилища S3
прямо сейчас я использую Amazon S3 и Paperclip, который позволяет моим пользователям загружать изображение, связанное с событием, которое они создают. Моя конечная цель-поскольку другие могут просматривать это событие, чтобы иметь возможность нажать на изображение и попросить его сохранить на свой компьютер. В настоящее время, нажав на ссылку откроется изображение в окне браузера. Я предпочитаю, чтобы он попросил их загрузить вместо этого. Все изображения сохраняются только на S3, а не локально. Нужно скрыть открытый url s3, если это возможно или замаскировать его
вот моя текущая настройка
.HTML-код
<%= link_to 'Download Creative', event.creative.url, class: "btn btn-info" %>
событие.rb
has_attached_file :creative,
:styles => { :thumb => "150x150", :custcreative => "250x75" },
:path => ":attachment/:id/:style.:extension",
:s3_domain_url => "******.s3.amazonaws.com",
:storage => :s3,
:s3_credentials => Rails.root.join("config/s3.yml"),
:bucket => '*****',
:s3_permissions => :public_read,
:s3_protocol => "http",
:convert_options => { :all => "-auto-orient" },
:encode => 'utf8'
надеюсь, кто-то может мне помочь.
5 ответов
чтобы сделать эту работу, я просто добавил новое действие в контроллер, так что в вашем случае это может быть:
#routes
resources :events do
member { get :download }
end
#index
<%= link_to 'Download Creative', download_event_path(event), class: "btn btn-info" %>
#events_controller
def download
data = open(event.creative_url)
send_data data.read, :type => data.content_type, :x_sendfile => true
end
изменить: правильное решение для действия контроллера можно найти здесь (я обновил код выше): заставить ссылку Скачать MP3, а не воспроизводить его?
чтобы избежать дополнительной нагрузки на ваше приложение (экономя время dyno в Heroku), я бы предпочел сделать что-то вроде этого: добавьте этот метод в свою модель с вложением:
def download_url(style_name=:original)
creative.s3_bucket.objects[creative.s3_object(style_name).key].url_for(:read,
:secure => true,
:expires => 24*3600, # 24 hours
:response_content_disposition => "attachment; filename='#{creative_file_name}'").to_s
end
а затем используйте его в своих представлениях / контроллерах следующим образом:
<%= link_to 'Download Creative', event.download_url, class: "btn btn-info" %>
теперь в aws-sdk v2 есть метод: presigned_url, определенный в Aws::S3:: Object, вы можете использовать этот метод для создания url-адреса прямой загрузки для объекта s3:
s3 = Aws::S3::Resource.new
# YOUR-OBJECT-KEY should be the relative path of the object like 'uploads/user/logo/123/pic.png'
obj = s3.bucket('YOUR-BUCKET-NAME').object('YOUR-OBJECT-KEY')
url = obj.presigned_url(:get, expires_in: 3600, response_content_disposition: "attachment; filename='FILENAME'")
тогда в ваших представлениях просто используйте:
= link_to 'download', url
event = Event.find(params[:id])
data = open(event.creative.url)
send_data data.read, :type => data.content_type, :x_sendfile => true, :url_based_filename => true
end
вам нужно установить "Содержание-Диспозиция "to"вложение " в заголовке ответа HTTP. Я не разработчик Rails - так что просто Google, и вы увидите много примеров , но это, вероятно, выглядит примерно так:
:content_disposition => "attachment"
или
...
:disposition => "attachment"