如何从Rails中的数据库下载二进制文件?

时间:2014-07-21 15:19:36

标签: ruby-on-rails download

我目前正在使用RoR 4.1.1开发自己的应用程序。

我的目标是创建一个存储.zip文件的平台,我希望用户能够下载这些文件。问题是我的老板要我直接将文件存储到数据库而不是文件系统。

因此我在ItemsController中执行了此操作:

    def create
@item = Item.new(item_params)
@item.file =  params[:item][:file].read
if @item.save 
  redirect_to @item
else 
  render 'new'
end

end

这在我的new.html.erb视图中:

<%= f.label :application %>
<%= f.file_field :file %>
  <p>
<%= f.submit %>
 </p>

这应该让我能够将内容上传到我的数据库。

现在我的数据库中有一个文件列,其中包含二进制文件。但我怎样才能下载这些?

1 个答案:

答案 0 :(得分:2)

您可以使用send_data控制器方法启动下载。文档:http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_data

因此,假设您为下载操作创建了一条路线:

get '/items/:id/download', as: :item_download

并为您的用户提供指向您商品的链接:

link_to 'Download', item_download_path(@item), disable_with: 'Downloading...'

现在您的控制器会向用户发起下载:

def download
  item = Item.find params[:id]

  send_data item.file, filename: item.name, type: 'zip', disposition: 'attachment'
end

用户点击Download链接后,它会变灰并更改为Downloading...,然后浏览器会打开其下载对话框并开始下载zip文件。

注意:我认为您的item有一个name方法,但它可以是您想要的任何内容。重要的选项是type: 'zip', disposition: 'attachment'。 Type是文件类型,可帮助您的浏览器知道它是什么,并且浏览器可以下载文件或在页面上呈现文件。例如,如果您正在下载pdf文件,则传递disposition: 'inline'会使浏览器显示pdf而不是直接下载。