Как временно загрузить файл в Rails 3? - PullRequest
7 голосов
/ 02 декабря 2011

Я создаю функцию CSV-загрузки для моего сайта. Я хочу загрузить файл, проанализировать его, а затем избавиться от него.

Я знаю, что могу загрузить и сохранить файл с помощью Paperclip, но это выглядит как перебор.

Все, что мне нужно сделать, - это проанализировать загруженный файл и никогда не сохранять его. Как бы я поступил так в Rails 3?

Примечание. Я бы предпочел выполнить загрузку вручную, не используя внешний гем, чтобы я мог научиться обрабатывать работы, но любые предложения приветствуются.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 02 декабря 2011

Используйте file_field помощник в вашей форме, затем в вашем контроллере вы можете использовать File.Write и File.read для сохранения файла.

Например, просмотр

<%= 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: Загрузка файлов .

1 голос
/ 03 июля 2015

Полный пример

Возьмем, к примеру, загрузку файла импорта, содержащего контакты.Вам не нужно хранить этот файл импорта, просто обработайте его и удалите.

Маршруты

rout.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

Форма

views / contacts / new_import.html.erb

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

  <%= f.file_field :import_file %>

<% end %>

Контроллер

controllers / 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
1 голос
/ 02 декабря 2011

Вставьте это в вашу модель

  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 (определенный способ, который будет работать, - это сохранение местоположения файла в БД и выборка оттуда, но это неправильный способ сделать это). В противном случае, я думаю, это должно сработать.

...