Masahiro Okubo

Rails4系APIに画像データを送信したら:ERROR EOFError: bad content body:が発生

Rails4系APIに画像データを送信したら:ERROR EOFError: bad content body:が発生

rails4系のAPIに画像を送信したらタイトルのエラーが発生しました
SPAクライアントから画像データが送信されてAPIで画像を保存する感じです

 

こちらをそれぞれ作成し

config/initializers/bad_multipart_form_data_sanitizer.rb
class BadMultipartFormDataSanitizer
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['CONTENT_TYPE'] =~ /multipart\/form-data/
      begin
        Rack::Multipart.parse_multipart(env)
      rescue EOFError => ex
        # set content-type to multipart/form-data without the boundary part
        # to handle the case where empty content is submitted
        env['CONTENT_TYPE'] = 'multipart/form-data'
      end
    end

    @app.call(env)
  end
end
config/initializers/rescue_json_parse_errors.rb
class RescueJsonParseErrors
  def initialize(app)
    @app = app
  end

  def call(env)
    begin
      @app.call(env)
    rescue ActionDispatch::ParamsParser::ParseError => _e
      return [
          400, {'Content-Type' => 'application/json'},
          [{error: 'There was a problem in the your JSON'}.to_json]
      ]
    end
  end
end

 

apprication.rbへ追加します

 

module Api
  class Application < Rails::Application
    config.time_zone = 'Tokyo'
    config.i18n.default_locale = :ja
    #ここから
    config.middleware.insert_before ActionDispatch::ParamsParser, 'RescueJsonParseErrors'
    config.middleware.insert_before Rack::Runtime, 'BadMultipartFormDataSanitizer'
    #ここまで
    config.generators do |g|
      g.test_framework :rspec,
                       fixtures: true,
                       view_specs: true,
                       helper_specs: false,
                       routing_specs: true,
                       controller_specs: true,
                       request_specs: true
      g.fixture_replacement :factory_girl, dir: "spec/factories"
    end

    config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*',
                 :headers => :any,
                 :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client'],
                 :methods => [:get, :post, :options, :delete, :put]
      end
    end
  end
end




 

それからリクエストを送ったら無事データを受信できました

Started POST "/api/file" for ::1 at 2019-09-18 18:57:13 +0900
  ActiveRecord::SchemaMigration Load (0.9ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
Processing by VariousStuff::VariousController#file as */*
-------------------------adsadsadsa
{"controller"=>"various_stuff/various", "action"=>"file"}
-------------------------dsadsa
Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.0ms)

 

参考記事

 

“EOFError: bad content body” for multipart form requests #903

Rails で JSON のリクエストパラメータがパース出来なかった場合の対応

Rails にJSONでリクエストを投げた際に発生する JSON::ParserError をハンドリングする


関連記事

copyright© 2016-2021 Masahiro Okubo