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 478109e..1fb0b5c 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 ba255e8..2d4e9ef 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