尝试使用send_file强制下载(副打开)时获取ActionController :: MissingFile

时间:2016-05-13 16:29:56

标签: ruby-on-rails paperclip

我正在使用带有回形针的rails 4.x.我想确保当用户点击链接下载回形针附件时,会下载文件而不是打开文件。

我正在使用的链接会打开或保存,具体取决于浏览器配置

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

该链接有时会打开文件而不是下载。

我设置了

的方法
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

我将网址硬连线进行测试。我还试过了send_file ("http://localhost:3000#{@document.doc_file.url}")send_file (@document.doc_file.url)。都没有工作。

我的链接是

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

routes.rb有

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

当我点击下载链接时,出现错误

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'

如果我将URL放入浏览器的地址栏中,它就可以正常工作。即`http://localhost:3000/images/39/Medical_Opportunity_EvaluationForm.pdf&#39;

1 个答案:

答案 0 :(得分:4)

send_file方法接受服务器上的文件的物理位置,而不是公共网址。因此,以下内容应该有效,具体取决于PDF文件实际所在的位置:

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'

如果这是一个回形针文档,path方法应该有效:

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

有关详细信息,请参阅the docs