不要只是复制并粘贴已接受的答案。这是一个不可低估的巨大安全风险。尽管该技术很聪明,但基于任何人都可以输入的参数来传递文件允许访问任何人可以想象的任何文件。
这是使用相同技术的更安全方法的示例。它假设有一个登录的用户拥有一个 API 令牌,但您应该能够将其调整到您自己的场景中。
在行动中:
current_user.pending_download = file_name
current_user.save!
respond_to do |format|
@java_url = "/ajax_download?token=#{current_user.api_token}"
format.js {render :partial => "downloadFile"}
end
在控制器中创建一个函数
def ajax_download
if params[:token] == current_user.api_token
send_file "path_to_file/" + current_user.pending_download
current_user.pending_download = ''
current_user.save!
else
redirect_to root_path, notice: "Unauthorized"
end
end
使用 _downloadFile.js.erb 创建部分视图文件夹名称
window.location.href = "<%=@java_url %>"
当然,您需要一条指向/ajax_download
in的路线routes.rb
get 'ajax_download', to: 'controller#ajax_download'