3

CSVファイルをHerokuにアップロードして処理する際に問題が発生しました。私のローカル環境では問題なく動作します。明確にしてください。ファイルをHerokuに保存する必要はありません。ファイルを処理してDBにインポートするために文字列に変換するために、リクエスト中にファイルにアクセスするだけです。

私がやりたいことは:

  1. CSVファイルをアップロード
  2. レポートの送信元のネットワークに応じて、ヘッダーブロックを削除します
  3. CSVデータをDBに読み込みます。この手順は正常に機能します。

コントローラーコード:

  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でそのエラーが発生しますか?

ありがとう!

4

5 に答える 5

7

Avishal's answer に基づいて、Rails 3 でこれを使用します。

@file = IO.read(params[:report].tempfile.path)
于 2011-01-06T06:35:27.063 に答える
4

実際、完全に真実ではありません。Herokuにファイルをアップロードすると、Tempfileクラスを介してリクエストの期間中そのファイルにアクセスできることがわかりました。一時ファイルを文字列に読み込んで、必要に応じて処理することができました(CSVです)。

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

text / csvファイルでは問題なく動作しますが、基本的なテキスト操作以上のことをしたい場合は、Joostが示唆しているようにS3を使用する必要があると思います。

于 2010-09-28T13:35:16.110 に答える
1

あなたはこれを知っていますか?

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

于 2010-09-11T22:41:09.247 に答える
1

私はまだこの問題に悩まされています。私はここで与えられたソリューションを試して、csvファイルのアップロードを実行し、それを解析して、アクティブなレコードを介してDBを埋めることができるようにしました。次のコードがあります。

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

コードはローカルでは完璧に機能しますが、ヘルコではまったく機能しません。エラーが発生し、heruko ログで確認できるのは次のとおりです。

2012-03-23 07:45:59 +0000 2012-03-23T07:46:00+00:00 app[web.1]: 2012-03で 122.172.25.106 の POST "/projects/1/upload_pivotal_csv" を開始しました-23T07:46:00+00:00 app[web.1]: NotImplementedError (Ruby 1.9 の標準 CSV ライブラリに切り替えてください。FasterCSV と Ruby 1.9 の m17n エンコーディング エンジンのサポートです。): 2012-03-23T07:46:00+00:00 app[web.1]: app/controllers/projects_controller.rb:17:in `upload_pivotal_csv' 2012-03-23T07:46:00+00:00 app[web. .1]: 2012-03-23T07:46:00+00:00 app[web.1]: 2012-03-23T07:46:00+00:00 heroku[ルーター]: POST castletrack.herokuapp.com/projects /1/upload_pivotal_csv dyno=web.1 queue=0 wait=0ms service=783ms status=500 bytes=728 2012-03-23T07:46:00+00:00 app[web.1]: ProjectsController#upload_pivotal_csv で処理中HTML 2012-03-23T07:46:00+00:00 app[web.1]: パラメータ: {"utf8"=>"✓", "authenticity_token"=>"sBmRWpGP3q9Hu7O2cMlmnGTByaTXValxYHw5+cFoSw0=", "file"=> #>, "commit"=>"Import", "id"=>"1"} 2012-03-23T07:46:00+00:00 app[web.1]: 406msで完了

Rubyバージョンと関係があると確信しています。私はローカルで ruby​​ 1.8.7 を使用しており、これは Rails 3 アプリケーションです。heruko にある ruby​​ のバージョンがわかりません。しかし、杉の山を使用していることはわかります。

于 2012-03-23T07:54:37.787 に答える
-2

うん。ファイル システムは読み取り専用です。ファイルを S3 に保存できます。

于 2010-09-28T05:27:50.707 に答える