From 1370d21460255914e03754fb0f20052e6b3002d7 Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Sat, 28 Mar 2015 23:14:33 -0700 Subject: Crude first pass at downloading files. --- app/controllers/application_controller.rb | 4 +++ app/controllers/downloads_controller.rb | 22 ++++++++++++++++ app/views/downloads/index.html.erb | 44 ++++++++----------------------- config/routes.rb | 3 ++- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d83690e..a994170 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,4 +2,8 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + + def not_found + raise ActionController::RoutingError.new('Not Found') + end end diff --git a/app/controllers/downloads_controller.rb b/app/controllers/downloads_controller.rb index 300d0b1..2681b0a 100644 --- a/app/controllers/downloads_controller.rb +++ b/app/controllers/downloads_controller.rb @@ -1,3 +1,6 @@ +require 'aws-sdk-core/s3' +require 'fileutils' + class DownloadsController < ApplicationController before_action :set_download, only: [:show, :edit, :update, :destroy] @@ -7,6 +10,25 @@ class DownloadsController < ApplicationController @downloads = Download.all end + # GET /downloads/:filename + def download + download = Download.find_by(filename: params[:filename]) or not_found + + s3client = Aws::S3::Client.new() + s3obj = Aws::S3::Object.new(ENV['S3_DOWNLOADS_BUCKET'], download.filename, client: s3client) + resp = s3obj.get + + FileUtils.mkdir_p(Rails.root.join('tmp', 'downloads')) + + cached_filename = Rails.root.join('tmp', 'downloads', download.filename) + + File.open(cached_filename, 'wb') do |file| + file.write resp.body.read + end + + send_file cached_filename + end + # GET /downloads/1 # GET /downloads/1.json def show diff --git a/app/views/downloads/index.html.erb b/app/views/downloads/index.html.erb index c017aab..0f0afc9 100644 --- a/app/views/downloads/index.html.erb +++ b/app/views/downloads/index.html.erb @@ -1,35 +1,13 @@

<%= notice %>

-

Listing Downloads

- - - - - - - - - - - - - - - <% @downloads.each do |download| %> - - - - - - - - - - - <% end %> - -
NameFilenameTypeDescriptionHits
<%= download.name %><%= download.filename %><%= download.type %><%= download.description %><%= download.hits %><%= link_to 'Show', download %><%= link_to 'Edit', edit_download_path(download) %><%= link_to 'Destroy', download, method: :delete, data: { confirm: 'Are you sure?' } %>
- -
- -<%= link_to 'New Download', new_download_path %> +<% @downloads.each do |download| %> +
+

<%= download.name %>

+

<%= download.description %>

+

+ Type: <%= download.type %> + Downloads: <%= download.hits %> +

+

<%= link_to "Download", download_path(download.filename) %>

+
+<% end %> diff --git a/config/routes.rb b/config/routes.rb index 1486509..33b0274 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,6 @@ Rails.application.routes.draw do - resources :downloads + get 'downloads' => 'downloads#index' + get 'downloads/:filename' => 'downloads#download', :filename => /.+/, :as => 'download' # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". -- cgit v1.2.3