Techioz Blog

Rails はアップロードするファイルタイプを .xls のみに制限します

概要

ビューから Excel シートをアップロードしたいのですが、Excel 2003 ワークブックのみが受け入れられます。 しかし、私の試みはうまくいきません。

これが私の現在の実装です。

視界の中で

<%= file_field_tag :contact_file %>

そしてコントローラー。

if File.extname( params[:contact_file] ) == 'xls'
      @list = @current_user.lists.build(params[:list])
      @counter =0
      ActiveRecord::Base.transaction do |transaction|
        if @list.save
          if params[:contact_file]
            ap params[:contact_file]
            oo = Spreadsheet.open(params[:contact_file].path).worksheet(0)
            1.upto(oo.last_row_index) do |line|
              @counter+=1
              row = oo.row(line)
              name = row[0]
              phone_number = row[1].to_i.to_s
              new_contact = @current_user.contacts.build
              new_contact.phone_number = phone_number
              new_contact.name = name
              ap new_contact
              if new_contact.valid?
                new_contact.save
                @list.contacts << new_contact
              else
                if not @errors
                  @errors ={}
                end
                @errors["#{@counter+1}"] = new_contact.errors
              end
            end
          end

          if @errors
            render action: 'new'
            raise ActiveRecord::Rollback
          end
          redirect_to @list, notice: 'List was successfully created.'
        else
          render action: 'new'
        end
      end
    else
      flash[:notice] ="Please upload the correct file-format. Upload MS-Excel 2003 workbooks (.xls files)"
      render action: 'new'
    end
  end

この行 File.extname( params[:contact_file] ) == ‘xls’ が機能しないように見えるため、何が問題になる可能性がありますか。

リクエストパラメータは次のようになります。

{"utf8"=>"✓", "authenticity_token"=>"tzwsIt6sPhEFEqwS6YraU7SYU+kEvAr1it33j8YzCPk=", "list"=>{"name"=>"acacia", "user_id"=>"1"}, "contact_file"=>#<ActionDispatch::Http::UploadedFile:0xd7ad3b8 @original_filename="NGOs.xlsx", @content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @headers="Content-Disposition: form-data; name=\"contact_file\"; filename=\"NGOs.xlsx\"\r\nContent-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\r\n", @tempfile=#<File:/tmp/RackMultipart20131206-14445-4cpor5>>, "commit"=>"Upload", "action"=>"create", "controller"=>"lists"}

解決策

falsetru の答えは素晴らしいです。 Excel ファイルには必ずしも .xls 拡張子が付いているわけではないという事実も考慮する必要があるかもしれないことを付け加えておきたいと思います。実際、現在のバージョンの Excel のデフォルトの拡張子は .xlsx です。したがって、今のように単一のファイル拡張子をチェックするのではなく。

File.extname( params[:contact_file] ) == '.xls'

代わりに、コレクションに対してチェックすることを検討することもできます。したがって、代わりに、チェックのために次のようなことを行うことができます

['.xls','.xlsx', '.xlsb'].include? File.extname(params[:contact_file])

Excel 拡張機能の完全なリストを確認して、どの拡張機能をサポートする必要があるかを判断するには、ここを参照してください。

http://office.microsoft.com/en-us/excel-help/file-formats-that-are-supported-in-excel-HP010014103.aspx