From ad4c289ec50f19b50a01fcb9bfe9920392432481 Mon Sep 17 00:00:00 2001 From: Alexey Verkhovsky Date: Sun, 12 Mar 2006 04:53:39 +0000 Subject: [PATCH] Added disposition to HTTP headers for sending files --- app/controllers/application.rb | 20 ++++++++++++++++---- app/controllers/file_controller.rb | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/controllers/application.rb b/app/controllers/application.rb index 7e6ae484..ea405188 100644 --- a/app/controllers/application.rb +++ b/app/controllers/application.rb @@ -51,13 +51,25 @@ class ApplicationController < ActionController::Base '.zip' => 'application/zip' } unless defined? FILE_TYPES - def content_type_header(file) - FILE_TYPES[File.extname(file)] || 'application/octet-stream' + DISPOSITION = { + 'application/octet-stream' => 'attachment', + 'image/gif' => 'inline', + 'image/jpeg' => 'inline', + 'application/pdf' => 'inline', + 'image/png' => 'inline', + 'text/plain' => 'inline', + 'application/zip' => 'attachment' + } unless defined? DISPOSITION + + def determine_file_options_for(file_name, original_options = {}) + original_options[:type] ||= (FILE_TYPES[File.extname(file_name)] or 'application/octet-stream') + original_options[:disposition] ||= (DISPOSITION[original_options[:type]] or 'attachment') + original_options[:stream] ||= false + original_options end def send_file(file, options = {}) - options[:type] = content_type_header(file) - options[:stream] = false + determine_file_options_for(file, options) super(file, options) end diff --git a/app/controllers/file_controller.rb b/app/controllers/file_controller.rb index 724e6b4c..57e8783a 100644 --- a/app/controllers/file_controller.rb +++ b/app/controllers/file_controller.rb @@ -19,11 +19,11 @@ class FileController < ApplicationController render end else - (render(:status => 404, :text => 'Unspecified file name') and return) unless @file_name + render(:status => 404, :text => 'Unspecified file name') and return unless @file_name # no form supplied, this is a request to download the file file = WikiFile.find_by_file_name(@file_name) if file - send_data(file.content, :filename => @file_name, :type => content_type_header(@file_name)) + send_data(file.content, determine_file_options_for(@file_name, :filename => @file_name)) else @file = WikiFile.new(:file_name => @file_name) render