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



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

我希望上传的文件能够根据文件名正确解析。我曾尝试使用regex和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| 

如果我把If语句取出来,它就会起作用,所以问题一定存在。我使用的是一个普通的上传表单。

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

/..csv$/i

我还删除了多余的括号,并添加了一个显式的.,这样mycsv就不会匹配。你也不需要匹配扩展名之前的所有字符(但可能想确保至少有一个字符,这样文件就不仅仅命名为".csv")。

此外,params[:uploadform][:file]很可能不是您所期望的字符串。它可能是一个ActiveDispatch::UploadedFile,在这种情况下,您必须调用它上的original_filename才能获得文件名:

params[:uploadform][:file].original_filename =~ /..csv$/i

最新更新