gpt4 book ai didi

ruby-on-rails-3 - 从 Carrierwave 文档附件的链接下载文件

转载 作者:行者123 更新时间:2023-12-04 06:05:03 28 4
gpt4 key购买 nike

我正在尝试创建一个简单的链接,单击该链接会启动与特定资源关联的文档的下载。我有一个资源模型,在该模型中有一个名为“文档”的列。单击链接时,我能够成功地查看内嵌文档,但我更愿意下载它。我一直在阅读关于 content-types 和 send_file,但我还没有能够将它们完全拼凑起来以发挥作用。

这是我认为我需要用于链接的代码:<%= link_to 'Download File', :action => "download_file" %>
这会引发错误:
ActiveRecord::RecordNotFound in ResourcesController#show
找不到 id=download_file 的资源

当我将链接更改为此时,它会在浏览器中打开文件:<%= link_to 'Open file', resource.document_url, :target => "_blank" %>
在我的 ResourcesController 中,我定义了这个方法:

  def download_file
@resource = Resource.find(params[:id])
send_file(@resource.file.path,
:filename => @resource.file.name,
:type => @resource.file.content_type,
:disposition => 'attachment',
:url_based_filename => true)
end

我在 routes.rb 中设置了一条路线,如下所示:
  resources :resources do
get 'resources', :on => :collection
end

因此,基于此错误,我在 ResourcesController 中的 download_file 方法似乎无法确定与文档关联的资源记录的 ID。

我在跑:
导轨 3.2.11
载波0.8.0
ruby 1.9.3-p194

我希望对此有所了解。我搜索了许多文章,但找不到简单的教程。谢谢。

最佳答案

我能够弄清楚这一点。我将尝试解释我是如何解决这个问题的。

download_file 方法正确位于 ResourcesController 中,但我没有使用正确的变量名称。以下是适合我的目的的正确方法定义:

  def download_file
@resource = Resource.find(params[:id])
send_file(@resource.document.path,
:type => 'application/pdf',
:disposition => 'attachment',
:url_based_filename => true)
end

就我而言,我在变量 @resource 中返回了一条记录,该记录具有与之关联的文档(同样,我使用的是 Carrierwave)。所以 send_file 需要的第一个参数是路径(参见 API for send_file )。此路径信息由@resource.document.path 提供。

send_file 接受许多其他参数,这些参数似乎是可选的,因为我只需要其中的三个。有关其他参数,请参阅 API 文档。

为我抛出错误的其中一个是类型:。我将变量“@resource.file.content_type”传递给它,但它显然是在寻找文字。一旦我通过它应用程序/pdf,它就起作用了。如果没有明确设置,下载的文件没有添加文件扩展名。无论如何,对于我的应用程序,该文档可以是从 pdf 到 word 再到 mp4 的各种不同的 mime 类型。所以我不确定如何指定多个。

对于我的目的(下载而不是在浏览器中显示)而言,真正重要的论点是 :disposition 需要设置为“附件”而不是“内联”。

另一个参数 :url_based_filename 显然用于从 URL 确定文件的名称。由于我没有提供文件名,也许这是我向正在下载的文件提供文件名的唯一方法,但我不确定这一点。

我还需要将 link_to 标记更改为: <%= link_to 'Download File', :action => 'download_file', :id => resource.id %>
请注意,提供带有当前资源 id 的 :id 符号提供了识别相关资源所需的特定信息。

我希望这可以帮助其他人。这个大家一定很清楚,因为我没有找到任何关于文件下载文件的基础教程。我仍然在学习很多东西。

更新:我不得不玩这个以获得所需的行为。这是有效的新方法:
      def download_file
@resource = Resource.find(params[:id])
send_file(@resource.document.path,
:disposition => 'attachment',
:url_based_filename => false)
end

通过这些更改,我不再需要设置 :type。设置 ":url_based_filename => true"继续在 URL 中的记录 ID 之后命名文件。根据我对这个参数的功能的阅读,将它设置为 false 似乎违反直觉,但是,这样做产生了以实际文件名命名文件的预期结果。

我也用过 mime-types gem并将以下内容添加到我的 video_uploader.rb 文件中:
require 'carrierwave/processing/mime_types'

class VideoUploader < CarrierWave::Uploader::Base
include CarrierWave::MimeTypes
process :set_content_type

这个 gem 显然设置了从文件名中的文件扩展名猜测的 mime 类型。这样做使我不必在我的 download_file 方法中的 send_file 参数中显式设置 :type 。

关于ruby-on-rails-3 - 从 Carrierwave 文档附件的链接下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15326776/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com