【问题标题】:How to create a file on users machine instead of creating in server and then to download using rails如何在用户机器上创建文件而不是在服务器中创建然后使用 rails 下载
【发布时间】:2018-06-26 10:48:35
【问题描述】:

我正在努力允许下载带有以下代码的 excel 文件:

login     = Etc.getlogin
@dataFile = "C:/rails/#{login}data.csv"

csv1=CSV.open(@dataFile, 'w') do |csv|
  $data.each do |eachrow|
    csv << [eachrow.name+"@gmail.com"]
  end
end

send_file(@dataFile, :filename => "#{login}data", :type =>  "application/csv")

使用上面的代码,我可以创建一个文件并写入数据。

而不是这个,我如何将数据写入 csv 并下载到用户机器而不是保存在本地/服务器中。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您可以使用 CSV 库生成一个字符串,使用 CSV::generate 而不是 CSV::open

    控制器:

    class DataController < ApplicationController
      def download
        respond_to do |format|
          format.csv { send_csv_download }
        end
      end
    
      private
    
      def send_csv_download
        string = CSV.generate do |csv|
          @data.each { |row| csv << ["#{row.name}@gmail.com"] }
        end
    
        send_data string, filename: 'foo.csv', type: :csv
      end
    
    end
    

    config/routes.rb:

    get '/download', to: 'data#download'
    

    查看:

    <%= link_to 'Download CSV', download_path(format: :csv) %>
    

    注意:显然,我不知道你从哪里得到你的@data,因为你的问题中没有指定它。

    【讨论】:

    • 用上面的代码试过了,但还是没有下载到文件。
    • @MallelaSriPrakash 有什么错误吗?我在 rails 5.1.5 中尝试过,它成功了。
    • @Mark 首先我们使用 CSV 的generate 方法来制作代表逗号分隔数据的字符串。然后它被包装在一个 I/O 流对象中,以便能够将其发送到客户端。但现在在我写这篇文章时,我认为我们可以删除 StringIO 并发送字符串本身。
    • 我没有看到任何正在下载的文件。我在按钮单击时调用 ajax,它从控制器调用方法。但是,根据这篇文章stackoverflow.com/questions/17304407/…,它似乎不适用于 ajax 调用
    • @MallelaSriPrakash 好吧,您应该在问题中提到 AJAX 调用。正如这里所建议的那样:stackoverflow.com/questions/16242359/… 您可以尝试渲染一个将为您下载文件的部分。但我会在没有 AJAX 的情况下这样做。
    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多