diff --git a/app/controllers/asciicasts_controller.rb b/app/controllers/asciicasts_controller.rb index 500723257..d8830ab8a 100644 --- a/app/controllers/asciicasts_controller.rb +++ b/app/controllers/asciicasts_controller.rb @@ -28,18 +28,12 @@ def show end format.json do - opts = if params[:dl] - { query: { "response-content-disposition" => "attachment; filename=#{asciicast.download_filename}" } } - else - {} - end - - redirect_to asciicast.data_url(opts) + serve_file(asciicast.data, !!params[:dl]) end format.png do asciicast_image_generator.generate(asciicast) if asciicast.image_stale? - redirect_to asciicast.image_url + serve_file(asciicast.image) end end end @@ -98,4 +92,19 @@ def asciicast_image_generator AsciicastImageGenerator.new(self) end + def serve_file(uploader, as_attachment = false) + opts = if as_attachment + { query: { "response-content-disposition" => "attachment; filename=#{asciicast.download_filename}" } } + else + {} + end + + url = uploader.url(opts) + + if url.starts_with?("/") + send_file uploader.path, disposition: as_attachment ? 'attachment' : 'inline' + else + redirect_to url + end + end end diff --git a/app/models/asciicast.rb b/app/models/asciicast.rb index b0841a347..357eb3d14 100644 --- a/app/models/asciicast.rb +++ b/app/models/asciicast.rb @@ -93,8 +93,16 @@ def to_param end end + def data + if file.present? + file + else + stdout_frames + end + end + def data_url(options = {}) - file_url(options) || stdout_frames_url(options) + data.url(options) end def download_filename diff --git a/app/serializers/asciicast_serializer.rb b/app/serializers/asciicast_serializer.rb index 67d9e8f30..f448ae139 100644 --- a/app/serializers/asciicast_serializer.rb +++ b/app/serializers/asciicast_serializer.rb @@ -11,7 +11,7 @@ def url if v0_url? object.stdout_frames_url else - object.data_url + asciicast_path(object, format: :json) end end diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 8d175ec94..2f313b01d 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -10,5 +10,11 @@ } config.fog_directory = CFG.aws_bucket config.fog_public = false + elsif CFG.carrierwave_storage == 'file' + config.root = Rails.root end end + +if File.exists?(Rails.root.to_s + "/public/uploads/asciicast") + raise "Please move all directories from ./public/uploads/ to ./uploads/" +end diff --git a/spec/features/png_spec.rb b/spec/features/png_spec.rb index 4541305cb..6b8e79b8d 100644 --- a/spec/features/png_spec.rb +++ b/spec/features/png_spec.rb @@ -7,7 +7,7 @@ scenario "Requesting PNG" do visit asciicast_path(asciicast, format: :png) - expect(current_path).to match(%r{/uploads/test/asciicast/image/\d+/\w+\.png$}) + expect(current_path).to match(%r{/a/\d+\.png$}) end end diff --git a/spec/serializers/asciicast_serializer_spec.rb b/spec/serializers/asciicast_serializer_spec.rb index d67586a47..a685cd3d3 100644 --- a/spec/serializers/asciicast_serializer_spec.rb +++ b/spec/serializers/asciicast_serializer_spec.rb @@ -13,7 +13,7 @@ end it 'includes url' do - expect(subject['url']).to eq(asciicast.file_url) + expect(subject['url']).to eq("/a/#{asciicast.id}.json") end it 'includes snapshot' do diff --git a/spec/services/asciicast_image_generator_spec.rb b/spec/services/asciicast_image_generator_spec.rb index c7f956b20..00f431e35 100644 --- a/spec/services/asciicast_image_generator_spec.rb +++ b/spec/services/asciicast_image_generator_spec.rb @@ -17,7 +17,7 @@ def rgb(color) end it 'generates screenshot of "snapshot frame"' do - png = ChunkyPNG::Image.from_file("#{Rails.root}/public/#{asciicast.image_url}") + png = ChunkyPNG::Image.from_file(asciicast.image.path) # make sure there are black-ish borders expect(rgb(png[1, 1])).to eq([18, 19, 20]) diff --git a/uploads/.gitignore b/uploads/.gitignore new file mode 100644 index 000000000..72e8ffc0d --- /dev/null +++ b/uploads/.gitignore @@ -0,0 +1 @@ +*