2016-05-13 10 views
0

Ich verwende Schienen 4.x mit Büroklammer. Ich möchte sicherstellen, dass, wenn der Benutzer auf einen Link klickt, um einen Büroklammer-Anhang herunterzuladen, die Datei heruntergeladen wird, anstatt sich zu öffnen.Abrufen von ActionController :: MissingFile beim Versuch, einen Download zu erzwingen (vice open) mit send_file

Der Link war ich mit, dass würde öffnen oder speichern im Browser-Konfiguration abhängig war

<%= link_to image_tag("save.gif", document.doc_file.url, :target => "_blank" %> 

Diese Verbindung manchmal die Datei anstelle des Herunterladens geöffnet.

I gesetzt, ein Verfahren zum

helper_method :download 

    def download 
    @document= Document.find(39) 
send_file ("http://localhost:3000/images/39/Medical_Opportunity_EvaluationForm.pdf?1458068410"), 
       :filename => @document.doc_file_file_name, 
       :type => @document.doc_file_content_type, 
       :disposition => 'attachment' 
    end 

I fest verdrahtet, die URL für das Testen auf. Ich hatte es auch mit send_file ("http://localhost:3000#{@document.doc_file.url}") und send_file (@document.doc_file.url) versucht. Seither hat gearbeitet.

Mein Link zu dem ist

<%= link_to image_tag("save.gif"), download_path(document.id) %> 

routes.rb hat

match 'documents/download/:id' => 'documents#download',via: [:get, :post], :as => 'download' 

Wenn ich auf dem Download-Link klicken, erhalte ich einen Fehler von

ActionController::MissingFile in DocumentsController#download 
Cannot read file http://localhost:3000/images/39/Medical_Opportunity_EvaluationForm.pdf 
Rails.root: C:/Users/cmendla/RubymineProjects/technical_library 

Application Trace | Framework Trace | Full Trace 
app/controllers/documents_controller.rb:17:in `download' 

Wenn ich setze die URL in eine Adressleiste in einem Browser funktioniert. das heißt `http://localhost:3000/images/39/Medical_Opportunity_EvaluationForm.pdf '

Antwort

2

Die send_file Methode akzeptiert den physischen Speicherort der Datei auf dem Server, nicht öffentliche URL. So etwas wie die folgenden funktionieren sollte, je nachdem, wo die PDF-Datei befindet sich tatsächlich:

send_file "#{Rails.root}/public/images/39/Medical_Opportunity_EvaluationForm.pdf", 
      :filename => @document.doc_file_file_name, 
      :type => @document.doc_file_content_type, 
      :disposition => 'attachment' 

Wenn dies ein Büroklammer Dokument ist, das path Methode sollte funktionieren:

send_file @document.doc_file.path, 
      :filename => @document.doc_file_file_name, 
      :type => @document.doc_file_content_type, 
      :disposition => 'attachment' 

Siehe the docs für weitere Informationen.

+0

Das hat es getan. Jetzt verstehe ich, warum ich den Fehler bekommen habe. Danke. –