使用rails中的switch/if语句中的regex上传后标识文件扩展名

fja*_*ahr 0 ruby regex file-upload ruby-on-rails-3

我正在开发一个解析各种形式的电子表格的应用程序.它适用于CSV,现在我正在尝试使用roo gem将其扩展到XLS,XLSX,ODS和Google Spreadsheets.

我希望根据文件名正确解析上传的文件.我试图通过正则表达式和switch以及if语句来实现这一点,但到目前为止它没有用.问题似乎在正则表达式的条件下,因为甚至不再解析CSV文件.

这是我目前的版本:

def create
  @deck = Deck.new
  @deck.name = params[:uploadform][:name]
  @deckmsg = ""

  if @deck.save
    @deckmsg='Deck was successfully created.'
  else
    respond_to do |format|
      format.html { render action: "new", notice: 'Deck was not created.' }
    end
  end

  if params[:uploadform][:file] =~ /.*(csv)$/
    begin
      @answers = Array.new
      @questions = Array.new
      CSV.parse(params[:uploadform][:file].read) do |row| 
Run Code Online (Sandbox Code Playgroud)

如果我把if语句拿出来就可以了,所以问题必须在那里.我正在使用普通的上传表单.

And*_*all 6

您上传的CSV文件可能是大写的扩展名吗?myfile.CSV你的正则表达式不匹配.你可以通过告诉它匹配不区分大小写来解决这个问题:

/.\.csv$/i
Run Code Online (Sandbox Code Playgroud)

我还删除了无关的括号,并在显式中添加,.以便mycsv不匹配.您也不需要在扩展名之前匹配所有字符(但可能希望确保至少有一个字符,因此文件不仅仅命名为".csv").

此外,它可能params[:uploadform][:file]不是您期望的字符串.它可能是一个ActiveDispatch::UploadedFile,在这种情况下你将不得不调用original_filename它来获取文件名:

params[:uploadform][:file].original_filename =~ /.\.csv$/i
Run Code Online (Sandbox Code Playgroud)