From 38e0c237a448c5d59caad9c6bab8461c7a118c09 Mon Sep 17 00:00:00 2001
From: Jean-Philippe Lang <jp_lang@yahoo.fr>
Date: Wed, 15 Aug 2007 15:36:15 +0000
Subject: [PATCH] Image attachments are now sent inline to be viewed directly
 in the browser.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@642 e93f8b46-1217-0410-a6f0-8f06a7374b81
---
 app/controllers/attachments_controller.rb | 15 +++++----------
 app/helpers/application_helper.rb         |  2 +-
 app/models/attachment.rb                  |  4 ++++
 3 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index 3ddb052dd..0913de529 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -19,18 +19,13 @@ class AttachmentsController < ApplicationController
   layout 'base'
   before_filter :find_project, :check_project_privacy
 
-  # sends an attachment
   def download
-    send_file @attachment.diskfile, :filename => @attachment.filename
-  rescue
-    render_404
-  end
-    
-  # sends an image to be displayed inline
-  def show
-    render(:nothing => true, :status => 404) and return unless @attachment.diskfile =~ /\.(jpeg|jpg|gif|png)$/i
-    send_file @attachment.diskfile, :filename => @attachment.filename, :type => "image/#{$1}", :disposition => 'inline'
+    # images are sent inline
+    send_file @attachment.diskfile, :filename => @attachment.filename, 
+                                    :type => @attachment.content_type, 
+                                    :disposition => (@attachment.image? ? 'inline' : 'attachment')
   rescue
+    # in case the disk file was deleted
     render_404
   end
  
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index cdf69d76c..f4d8a0d54 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -163,7 +163,7 @@ module ApplicationHelper
         rf = Regexp.new(filename,  Regexp::IGNORECASE)
         # search for the picture in attachments
         if found = attachments.detect { |att| att.filename =~ rf }
-          image_url = url_for :controller => 'attachments', :action => 'show', :id => found.id
+          image_url = url_for :controller => 'attachments', :action => 'download', :id => found.id
           "!#{align}#{image_url}!"
         else
           "!#{align}#{filename}!"
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index 108baf99a..443a75bab 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -84,6 +84,10 @@ class Attachment < ActiveRecord::Base
     container.is_a?(Project) ? container : container.project
   end
   
+  def image?
+    self.filename =~ /\.(jpeg|jpg|gif|png)$/i
+  end
+  
 private
   def sanitize_filename(value)
       # get only the filename, not the whole path
-- 
GitLab