如何在Rails 3中临时上传文件?

时间:2011-12-01 23:42:50

标签: ruby ruby-on-rails-3 file-upload csv paperclip

我正在为我的网站创建CSV上传功能。 我正在寻找上传文件,解析它,然后处理它。

我知道我可以使用Paperclip上传和保存文件,但这看起来有点像矫枉过正。

我需要做的就是解析上传的文件,永远不要保存。 我将如何在Rails 3中执行此操作?

注意:我更喜欢手动上传而不使用外部宝石,所以我可以学习如何处理作品,但欢迎任何建议。

谢谢!

3 个答案:

答案 0 :(得分:7)

在表单中使用file_field帮助器,然后在控制器中,您可以使用File.WriteFile.read来保存文件。

E.g。图

<%= form_for @ticket do |f| %>
  <%= f.file_field :uploaded_file %>
<% end %>

控制器

def upload
  uploaded = params[:ticket][:uploaded_file]
  File.open(<insert_filename_here>, 'w') do |file|
    file.write(uploaded.read)
  end
end

修改:刚看到@ klochner的评论,该链接几乎说明了我所说的内容,请遵循:RubyOnRails Guides: Uploading Files

答案 1 :(得分:1)

将其粘贴到您的模型中

  def parse_file
   File.open(uploaded/file/path, 'w') do |f|  # Feed path that user gives in some way
   ## Parse here
   end
  end

这在视野中

  <%=form_for @page, :multipart => true do |f|%>

    <ul><li><%= f.label :file%></li>
    <li><%= f.file_field :uploaded_file%></li></ul>

  <%end%>

如果有效,请告诉我。如果它失败了找出一种方法来在parse_file方法中提供uploaded_file的路径(确定的方法是在db中存储文件位置并从那里拾取,但这不是正确的方法)。否则,我想它应该有效。

答案 2 :(得分:1)

完整示例

例如,上传包含联系人的导入文件。您不需要存储此导入文件,只需处理它并丢弃它。

路线

<强>的routes.rb

resources :contacts do 
  collection do
    get 'import/new', to: :new_import  # import_new_contacts_path

    post :import, on: :collection      # import_contacts_path
  end
end

表格

<强>视图/联系人/ new_import.html.erb

<%= form_for @contacts, url: import_contacts_path, html: { multipart: true } do |f| %>

  <%= f.file_field :import_file %>

<% end %>

控制器

<强>控制器/ contacts_controller.rb

def new_import
end

def import
  begin
    Contact.import( params[:contacts][:import_file] ) 

    flash[:success] = "<strong>Contacts Imported!</strong>"

    redirect_to contacts_path

  rescue => exception 
    flash[:error] = "There was a problem importing that contacts file.<br>
      <strong>#{exception.message}</strong><br>"

    redirect_to import_new_contacts_path
  end
end

联系模式

<强>模型/ contact.rb

def import import_file 
  File.foreach( import_file.path ).with_index do |line, index| 

    # Process each line.

    # For any errors just raise an error with a message like this: 
    #   raise "There is a duplicate in row #{index + 1}."
    # And your controller will redirect the user and show a flash message.

  end
end