在Rails 5

时间:2018-04-07 11:53:30

标签: ruby-on-rails ruby

我正在尝试阅读表单上传的.csv文件。我的答案部分来自几个答案:In Ruby, how to read data column wise from a CSV file?how to read a User uploaded file, without saving it to the databaseRails - Can't import data from CSV file。但到目前为止还没有任何效果。

这是我的代码:

def upload_file
  file = Tempfile.new(params[:search_file])
  csv_text = File.read(file)
  csv = CSV.parse(csv_text, :headers => true)
  csv.each do |row|
    puts row
  end
  render json: {success: true}
end

我确信该文件不是零。它包含4列和2行简单文本。但是,上面的file值表示为空数组,csv_text值为空字符串。我非常确定该文件包含值。

我也试过params[:search_field].read,每次都会抛出一个错误,说“未定义的方法'读''。

如何从用户上传的文件中简单地读取这些值?我在轨道5.1.6和ruby 2.3。

编辑: 我已经尝试了下面的一些解决方案。但问题是,当我调用file.write时,它不会写入文件的内容 - 它只是将文件的名称(如myFileNameHere.csv)写为临时文件的字符串。现在“ok测试”从不在下面的代码中打印到终端。这是我现在的代码:

file = Tempfile.new(['hello', '.csv'])
file.write(params[:search_file])
file.rewind
csv_text = file.read
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
  puts "ok testing row"
  puts row
end
file.close
file.unlink    # deletes the temp file

2 个答案:

答案 0 :(得分:0)

您正在读取空的临时文件。当你输入params [:search_file]时,这个值将成为新的Tempfile文件名的一部分(就像这个" / tmp /#{params [:search_file]}。24722.0")。

因此,当您执行File.read(文件)时,它将尝试读取其文件名中包含params [:search_file]值的临时文件,但其中的表单中没有其他值。

您应该跳过Tempfile部分并使用File.read(params [:search_file])加载params [:search_file]或者使用params [:search_file]内容填充新的Tempfile对象。 (我会推荐第一个。)

答案 1 :(得分:0)

Tempfile.new('something')始终返回一个空的临时文件,其基本名称中包含“something”。

首先创建临时文件(使用您想要的文件名),然后您可以从params[:search_file]编写内容,快退并阅读。

来源:Class: Tempfile (Ruby 1.9.3)