我正在尝试阅读表单上传的.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 database和Rails - 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
答案 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]
编写内容,快退并阅读。