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