]> git.openstreetmap.org Git - rails.git/commitdiff
Avoid reading traces and trace images into memory when sending them to
authorTom Hughes <tom@compton.nu>
Thu, 21 Jun 2007 23:19:25 +0000 (23:19 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 21 Jun 2007 23:19:25 +0000 (23:19 +0000)
the client, and make sure the MIME type is correct for trace files.

app/controllers/trace_controller.rb
app/models/trace.rb

index 478109eb06c04e1bf990e327f49936146fb77091..1fb0b5c65b48c2ab0e09d46a5c3adcb768b441df 100644 (file)
@@ -120,8 +120,10 @@ class TraceController < ApplicationController
 
   def data
     trace = Trace.find(params[:id])
-    if trace.public? or (@user and @user == trace.user)
-      send_data(File.open("/home/osm/gpx/#{trace.id}.gpx",'r').read , :filename => "#{trace.id}.gpx", :type => 'text/plain', :disposition => 'inline')
+    if trace and (trace.public? or (@user and @user == trace.user))
+      send_file(trace.trace_name, :filename => "#{trace.id}.gpx", :type => trace.mime_type, :disposition => 'attachment')
+    else
+      render :nothing, :status => 404
     end
   end
 
@@ -152,12 +154,20 @@ class TraceController < ApplicationController
 
   def picture
     trace = Trace.find(params[:id])
-    send_data(trace.large_picture, :filename => "#{trace.id}.gif", :type => 'image/gif', :disposition => 'inline') if trace.public? or (@user and @user == trace.user)
+    if trace and (trace.public? or (@user and @user == trace.user))
+      send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => 'image/gif', :disposition => 'inline')
+    else
+      render :nothing, :status => 404
+    end
   end
 
   def icon
     trace = Trace.find(params[:id])
-    send_data(trace.icon_picture, :filename => "#{trace.id}_icon.gif", :type => 'image/gif', :disposition => 'inline') if trace.public? or (@user and @user == trace.user)
+    if trace and (trace.public? or (@user and @user == trace.user))
+      send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => 'image/gif', :disposition => 'inline')
+    else
+      render :nothing, :status => 404
+    end
   end
 
   def api_details
index ba255e85d4a6d1c15169a76497f32e490acbcc70..2d4e9ef8ab12381a92b22cd13d7ae2b2ca6b47cb 100644 (file)
@@ -72,6 +72,10 @@ class Trace < ActiveRecord::Base
     "/home/osm/gpx/#{id}.gpx"
   end
 
+  def mime_type
+    return `file -bi #{trace_name}`.chomp
+  end
+
   def to_xml_node
     el1 = XML::Node.new 'gpx_file'
     el1['id'] = self.id.to_s