Heroku проблема загрузки файла - PullRequest
3 голосов
/ 11 сентября 2010

У меня возникла проблема с загрузкой CSV-файла в Heroku и его обработкой.Это прекрасно работает в моей местной среде.Просто будьте ясны, мне не нужно сохранять файл на Heroku, просто обращайтесь к нему во время запроса, чтобы преобразовать его в строку для обработки и импорта в БД.

Что я хочу сделатьis:

  1. Загрузить CSV-файл
  2. Извлечь блок заголовка, в зависимости от того, из какой сети получен отчет
  3. Считать данные CSV в БД.Этот шаг работает отлично.

Код контроллера:

  def create
    @account = Account.find(params[:report][:account_id])
    @file = params[:report][:file].read
    # logger.info file.inspect
    case @account.provider
    when "Microsoft AdCenter" then @file.gsub!(/\A(.*)\n\n/im, "")
    when "Google AdWords" then @file.gsub!(/\A(.*)\n/i, "")
    else
      raise "Invalid PPC report format"
    end
  end

Вот трассировка стека:

Processing ImportController#create (for XX.182.6.XXX at 2010-09-11 09:19:01) [POST]
  Parameters: {"commit"=>"Upload", "action"=>"create", "authenticity_token"=>"XXXXXwoFpvRO3vN8XVXRDg8rikFsj2TFTW7mrcTgg=", "controller"=>"import", "report"=>{"account_id"=>"1", "file"=>#<File:/home/slugs/126077_0657264_9a92/mnt/tmp/RackMultipart.9845.0>}}

NoMethodError (private method `gsub!' called for #<Tempfile:0x2b8ccb63ece0>):
  /usr/local/lib/ruby/1.8/delegate.rb:270:in `method_missing'
  app/controllers/import_controller.rb:15:in `create'
  warden (0.10.7) lib/warden/manager.rb:35:in `call'
  warden (0.10.7) lib/warden/manager.rb:34:in `catch'
  warden (0.10.7) lib/warden/manager.rb:34:in `call'
  /home/heroku_rack/lib/static_assets.rb:9:in `call'
  /home/heroku_rack/lib/last_access.rb:25:in `call'
  /home/heroku_rack/lib/date_header.rb:14:in `call'
  thin (1.0.1) lib/thin/connection.rb:80:in `pre_process'
  thin (1.0.1) lib/thin/connection.rb:78:in `catch'
  thin (1.0.1) lib/thin/connection.rb:78:in `pre_process'
  thin (1.0.1) lib/thin/connection.rb:57:in `process'
  thin (1.0.1) lib/thin/connection.rb:42:in `receive_data'
  eventmachine (0.12.6) lib/eventmachine.rb:240:in `run_machine'
  eventmachine (0.12.6) lib/eventmachine.rb:240:in `run'
  thin (1.0.1) lib/thin/backends/base.rb:57:in `start'
  thin (1.0.1) lib/thin/server.rb:150:in `start'
  thin (1.0.1) lib/thin/controllers/controller.rb:80:in `start'
  thin (1.0.1) lib/thin/runner.rb:173:in `send'
  thin (1.0.1) lib/thin/runner.rb:173:in `run_command'
  thin (1.0.1) lib/thin/runner.rb:139:in `run!'
  thin (1.0.1) bin/thin:6
  /usr/local/bin/thin:20:in `load'
  /usr/local/bin/thin:20

Rendering /disk1/home/slugs/126077_0657264_9a92/mnt/public/500.html (500 Internal Server Error)

Кто-нибудь знает, почему он работает нормально локально, но затем выдает эту ошибку на Heroku?

Спасибо!

Ответы [ 5 ]

7 голосов
/ 06 января 2011

Исходя из ответа Авишала, я использую это с Rails 3:

@ file = IO.read (params [: report] .tempfile.path)

4 голосов
/ 28 сентября 2010

Не совсем верно, на самом деле.Оказывается, если вы загружаете файл в Heroku, вы можете получить к нему доступ во время запроса через класс Tempfile.Я смог прочитать временный файл в строку и затем обработать его по мере необходимости (это CSV):

@file = IO.read(params[:report][:file].path)

Работает нормально для текстовых / CSV-файлов, но я думаю, если вы хотите сделать больше, чем простоманипуляция с текстом, вы должны идти с S3, как предлагает Joost.

1 голос
/ 23 марта 2012

Я все еще отстой в этой проблеме.Я попробовал решение, приведенное здесь, чтобы иметь возможность сделать загрузку файла CSV, а затем проанализировать его, чтобы заполнить мою БД с помощью активной записи.У меня есть следующий код:

file = IO.read(params[:file].tempfile.path)
    FasterCSV.new(file, :headers => true).each do |row|
         # my parsing logic
    end

Код просто отлично работает в местном, но не работает в Heruko.Я получаю сообщение об ошибке, и все, что я вижу в журналах heruko, это:

Запущено POST "/ projects / 1 / upload_pivotal_csv" для 122.172.25.106 в 2012-03-23 ​​07:45:59 +0000 2012-03-23T07: 46: 00 + 00: 00 приложение [web.1]: 2012-03-23T07: 46: 00 + 00: 00 приложение [web.1]: NotImplementedError (Пожалуйста, переключитесь на Ruby 1.9 'стандартная библиотека CSV. Это FasterCSV плюс поддержка механизма кодирования m17n в Ruby 1.9.): 2012-03-23T07: 46: 00 + 00: 00 app [web.1]: app / controllers / projects_controller.rb: 17: в `upload_pivotal_csv '2012-03-23T07: 46: 00 + 00: 00 приложение [web.1]: 2012-03-23T07: 46: 00 + 00: 00 приложение [web.1]: 2012-03-23T07: 46: 00 + 00: 00 heroku [роутер]: POST-23T07: 46: 00 + 00: 00 приложение [web.1]: обработка ProjectsController # upload_pivotal_csv как HTML 2012-03-23T07: 46: 00 + 00: 00 приложение [web.1]: Параметры: {"utf8"=> "✓", "authenticity_token" => "sBmRWpGP3q9Hu7O2cMlmnGTByaTXValxYHw5 + cFoSw0 =", "file" => #>, "commit" =>"Import", "id" => "1"} 2012-03-23T07: 46: 00 + 00: 00 app [web.1]: Завершено за 406 мс

Я уверен, что у него есть чем занятьсяс рубиновой версией.Я использую ruby ​​1.8.7 локально и его приложение рельсы 3.Я не уверен, какая версия ruby ​​есть на heruko.Но я могу сказать, что я использую стек ceder.

1 голос
/ 12 сентября 2010

Вам известно об этом?

http://devcenter.heroku.com/categories/platform-constraints

0 голосов
/ 28 сентября 2010

Да.Файловая система доступна только для чтения.Вы можете хранить ваши файлы на S3 .

...