我目前正在使用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>
这应该让我能够将内容上传到我的数据库。
现在我的数据库中有一个文件列,其中包含二进制文件。但我怎样才能下载这些?
答案 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而不是直接下载。