我有以下Ruby代码,它设置一个表单来选择文件:
<%= form_for :import, :url=>{:controller=>"products", :action=>"import"}, :html => { :multipart => true } do |f| %>
<div class= "field">
<%= f.file_field :import %>
<%= submit_tag 'Import' %>
</div>
在控制器中,我试图调用从本地驱动器中选择的文件。此行适用于特定文件:
book = Spreadsheet.open 'c:/source.xls'
但我不知道如何在控制器中调用从表单中选择的文件。
有什么想法吗?
答案 0 :(得分:0)
文件数据将在params[:import][:import]
中,而不在实际文件中。上传文件后,没有类似“c:/ ...”的内容。
如果需要,请打开一个新文件,然后将该数据写入其中。
或者使用像carrierwave这样的东西为你做,并在保存后获取文件的实际路径。
答案 1 :(得分:0)
以下是现在可以使用的代码:
def import
require 'spreadsheet'
Spreadsheet.client_encoding = 'UTF-8'
import_file = params[ :import ][ :import ]
file = FileUploader.new
file.store!(import_file)
book = Spreadsheet.open "#{file.store_path}"
sheet1 = book.worksheet 0
sheet1.each 1 do |row|
@product = Product.new(:code => row[0], :name => row[1], :status => row[2], :account => current_user.account).save
端
答案 2 :(得分:0)
使用以下插件之一处理文件上传。
attachement_fu
和paperclip
。
这是关于paperclip http://railscasts.com/episodes/134-paperclip的railscast的教程,这是一个附带教程http://clarkware.com/cgi/blosxom/2007/02/24#FileUploadFu