diff --git a/Gemfile b/Gemfile index f33c823..61e3858 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,8 @@ source 'http://rubygems.org' gem 'rack', '~> 1.6.0' -gem 'grape', '~> 0.10.1' +# gem 'grape', '~> 0.10.1' +gem 'grape', path: '/Users/cdan/work/dan-corneanu/grape' gem 'grape-entity', '~> 0.4.4' gem 'json', '~> 1.7.7' gem 'newrelic_rpm', '~> 3.5.4.34' @@ -10,6 +11,8 @@ gem 'rack-cors', '~> 0.2.8' gem 'grape-swagger', '~> 0.9.0' gem 'mime-types' gem 'nokogiri', '1.6.3.1' +gem 'pry' +gem 'pry-byebug' group :development do gem 'rake', '~> 10.0.3' diff --git a/Gemfile.lock b/Gemfile.lock index 91e5af4..d566caa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,6 +15,8 @@ GEM ice_nine (~> 0.11.0) thread_safe (~> 0.3, >= 0.3.1) builder (3.2.2) + byebug (4.0.5) + columnize (= 0.9.0) capybara (2.4.4) mime-types (>= 1.16) nokogiri (>= 1.3.3) @@ -28,10 +30,11 @@ GEM coderay (1.1.0) coercible (1.0.0) descendants_tracker (~> 0.0.1) + columnize (0.9.0) descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) diff-lcs (1.2.5) - equalizer (0.0.9) + equalizer (0.0.11) ffi (1.9.6) formatador (0.2.5) grape (0.10.1) @@ -68,7 +71,7 @@ GEM libnotify rb-inotify spoon - hashie (3.3.2) + hashie (3.4.1) hitimes (1.2.2) i18n (0.7.0) ice_nine (0.11.1) @@ -102,6 +105,10 @@ GEM coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) + pry-byebug (3.1.0) + byebug (~> 4.0) + pry (~> 0.10) + racc (1.4.12) rack (1.6.0) rack-accept (0.4.5) rack (>= 0.4) @@ -149,7 +156,7 @@ GEM hitimes tzinfo (1.2.2) thread_safe (~> 0.1) - virtus (1.0.3) + virtus (1.0.5) axiom-types (~> 0.1) coercible (~> 1.0) descendants_tracker (~> 0.0, >= 0.0.3) @@ -175,6 +182,8 @@ DEPENDENCIES newrelic-grape (~> 1.1.0) newrelic_rpm (~> 3.5.4.34) nokogiri (= 1.6.3.1) + pry + pry-byebug racc rack (~> 1.6.0) rack-cors (~> 0.2.8) diff --git a/api/upload_big_file.rb b/api/upload_big_file.rb new file mode 100644 index 0000000..f1da4eb --- /dev/null +++ b/api/upload_big_file.rb @@ -0,0 +1,30 @@ +module Acme + class UploadBigFile < Grape::API + content_type :png, 'image/png' + + desc 'Upload and download a big file of any format using IO.' + post 'big_download' do + filename = params[:file][:filename] + # content_type MIME::Types.type_for(filename)[0].to_s + content_type 'image/png' + env['api.format'] = :png + header 'Content-Disposition', "attachment; filename*=UTF-8''#{URI.escape(filename)}" + + temp_file = params[:file][:tempfile] + body FileStreamer.new temp_file.path + nil + end + end + + class FileStreamer + def initialize(file_path) + @file_path = file_path + end + + def each(&blk) + File.open(@file_path, 'r') do |file| + file.each(10, &blk) + end + end + end +end diff --git a/app/api.rb b/app/api.rb index 5a1a7bd..51f40cf 100644 --- a/app/api.rb +++ b/app/api.rb @@ -11,6 +11,7 @@ class API < Grape::API mount ::Acme::PostJson mount ::Acme::ContentType mount ::Acme::UploadFile + mount ::Acme::UploadBigFile mount ::Acme::Entities::API add_swagger_documentation api_version: 'v1' end diff --git a/spec/api/upload_big_file_spec.rb b/spec/api/upload_big_file_spec.rb new file mode 100644 index 0000000..0351807 --- /dev/null +++ b/spec/api/upload_big_file_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe Acme::API do + include Rack::Test::Methods + + def app + Acme::API + end + + it 'uploads and downloads a PNG file' do + image_filename = 'spec/fixtures/grape_logo.png' + post '/api/big_download.png', file: Rack::Test::UploadedFile.new(image_filename, 'image/png', true) + expect(last_response.status).to eq(201) + expect(last_response.headers['Content-Type']).to eq('image/png') + expect(last_response.headers['Content-Disposition']).to eq("attachment; filename*=UTF-8''grape_logo.png") + File.open(image_filename, 'rb') do |io| + expect(last_response.body).to eq io.read + end + end +end