将简单的CSV文件上载到控制器

时间:2012-12-30 02:14:45

标签: ruby arrays ruby-on-rails-3 file-upload hash

我正在尝试将CS​​V文件上传到我的控制器并访问其中的数据。

以下是Controller的代码:

class DatabaseImporterController < ApplicationController
  def index
  end

  def import
    # Receive the uploaded CSV file and import to the database.
    csv_file = params[:csv_file]
    logger.debug  { csv_file.inspect }
    #CSV.foreach("parse.csv") do |row|

    #end
    render :template => "database_importer/index"
  end
end

logger.debug的输出:

{"utf8"=>"✓", 
 "authenticity_token"=>"Z4+XlmrcH+8JPL6Yq52ymVOMfiGEI9mN8LuoxoBLp8M=", 
 "csv_file"=>#<ActionDispatch::Http::UploadedFile:0x007feca81b3fb8 @original_filename="Install-Linux-tar.txt", @content_type="text/plain", @headers="Content-Disposition: form-data; name=\"csv_file\"; filename=\"Install-Linux-tar.txt\"\r\nContent-Type: text/plain\r\n", @tempfile=#<File:/tmp/RackMultipart20121229-10294-1ngf634>>, 
 "commit"=>"Import CSV Car Database", 
 "controller"=>"database_importer", 
 "action"=>"import"}

根据官方Ruby on Rails page的文件:

  

params散列中的对象是IO的子类的实例。根据上传文件的大小,它实际上可能是StringIO或由临时文件支持的File实例。

据我了解,上传的文件位于我的光盘中(在我的Heroku实例中),我可以暂时访问它。

如何访问该文件?我尝试了以下内容,并得到错误消息:

csv_file = params[:csv_file][:tempfile] # This is how I try to get the file page of the temporary file.

undefined method `[]' for #<ActionDispatch::Http::UploadedFile:0x007fecb02103c8>

1 个答案:

答案 0 :(得分:2)

您想拨打tempfile,而不是[:tempfile]

params[:csv_file].tempfile

您可以在docs for ActionDispatch::Http::UploadedFile中看到所有可用的方法。