Ruby on rails 将Rails应用程序移动到EC2,现在我的文件上载得到一个Encoding::UnfinedConversionError(“xC3”从ASCII-8BIT到UTF-8)错误

Ruby on rails 将Rails应用程序移动到EC2,现在我的文件上载得到一个Encoding::UnfinedConversionError(“xC3”从ASCII-8BIT到UTF-8)错误,ruby-on-rails,amazon-web-services,amazon-ec2,paperclip,amazon-elastic-beanstalk,Ruby On Rails,Amazon Web Services,Amazon Ec2,Paperclip,Amazon Elastic Beanstalk,我有一个Rails应用程序,已经运行了一年多,没有任何问题,运行在自定义的Ubuntu/Nginx/Puma设置上 由于托管公司的各种问题,我本周末将应用程序转移到EC2上——在他们的Nginx/Puma/Ruby2.2堆栈上使用ElasticBeanstalk 除了上传文件外,一切正常 应用程序本身使用回形针gem来处理附件-实际文件在上传到由我的客户机控制的文件服务器之前只是暂时保存在回形针中(最早的版本使用S3存储,但现在它上传,将“工作表”附加到作业上,然后立即上传“工作表”到文件服务器

我有一个Rails应用程序,已经运行了一年多,没有任何问题,运行在自定义的Ubuntu/Nginx/Puma设置上

由于托管公司的各种问题,我本周末将应用程序转移到EC2上——在他们的Nginx/Puma/Ruby2.2堆栈上使用ElasticBeanstalk

除了上传文件外,一切正常

应用程序本身使用回形针gem来处理附件-实际文件在上传到由我的客户机控制的文件服务器之前只是暂时保存在回形针中(最早的版本使用S3存储,但现在它上传,将“工作表”附加到作业上,然后立即上传“工作表”到文件服务器)

正如我所说,在我的旧服务器上,这一切都很正常。但现在,在EC2上,我得到了一个Encoding::UndefinedConversionError(从ASCII-8BIT到UTF-8的“\xC3”)错误

工作表本身可以是Excel文件或CSV文件。其定义如下:

class Job < ActiveRecord::Base
  ...
  has_attached_file :job_sheet
  validates_attachment_file_name :job_sheet, matches: [/csv\Z/, /xls\Z/, /xlsx\Z/]
  validates_attachment_presence :job_sheet
  ...
end
因此,除了实际逻辑在一个单独的“CreatesJob”类中之外,没有什么不寻常的事情发生——基本上是一种标准的Rails/回形针上传情况

但是,一些上载失败,生产日志中有以下内容:

I, [2016-03-22T10:12:58.701172 #23116]  INFO -- : Started POST "/jobs" for 80.0.249.70 at 2016-03-22 10:12:58 +0000
F, [2016-03-22T10:12:58.706190 #23116] FATAL -- : Encoding::UndefinedConversionError ("\xC3" from ASCII-8BIT to UTF-8):
  actionpack (4.2.0) lib/action_dispatch/http/upload.rb:31:in `encode'
  actionpack (4.2.0) lib/action_dispatch/http/upload.rb:31:in `initialize'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:51:in `new'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:51:in `normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:57:in `block in normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each_with_object'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:57:in `block in normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each_with_object'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/request.rb:308:in `POST'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:14:in `parameters'
  actionpack (4.2.0) lib/action_dispatch/http/filter_parameters.rb:37:in `filtered_parameters'
  actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:22:in `process_action'
  actionpack (4.2.0) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
  activerecord (4.2.0) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (4.2.0) lib/abstract_controller/base.rb:137:in `process'
  actionview (4.2.0) lib/action_view/rendering.rb:30:in `process'
  actionpack (4.2.0) lib/action_controller/metal.rb:195:in `dispatch'
  actionpack (4.2.0) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.2.0) lib/action_controller/metal.rb:236:in `block in action'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `call'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:42:in `serve'
  actionpack (4.2.0) lib/action_dispatch/journey/router.rb:43:in `block in serve'
  actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `each'
  actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `serve'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:802:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/rack/agent_hooks.rb:30:in `traced_call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/rack/browser_monitoring.rb:23:in `traced_call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/etag.rb:24:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/conditionalget.rb:38:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/head.rb:13:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/flash.rb:260:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.6.1) lib/rack/session/abstract/id.rb:220:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/cookies.rb:560:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  activerecord (4.2.0) lib/active_record/query_cache.rb:36:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  activerecord (4.2.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `call'
  activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `_run_callbacks'
  activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_call_callbacks'
  activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  railties (4.2.0) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.0) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.2.0) lib/rails/rack/logger.rb:20:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/methodoverride.rb:22:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/runtime.rb:18:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  activesupport (4.2.0) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/static.rb:113:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/sendfile.rb:113:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  railties (4.2.0) lib/rails/engine.rb:518:in `call'
  railties (4.2.0) lib/rails/application.rb:164:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  puma (2.11.0) lib/puma/configuration.rb:82:in `call'
  puma (2.11.0) lib/puma/server.rb:507:in `handle_request'
  puma (2.11.0) lib/puma/server.rb:375:in `process_client'
  puma (2.11.0) lib/puma/server.rb:262:in `block in run'
  puma (2.11.0) lib/puma/thread_pool.rb:104:in `call'
  puma (2.11.0) lib/puma/thread_pool.rb:104:in `block in spawn_thread'
与此错误相关的其他答案似乎都是关于强制对文件进行编码。但这里的问题似乎是1)有时是二进制文件(xls),有时是文本文件(csv),所以我不能到处乱动它,2)ActionDispatch是个例外;看来在我看到上传之前就发生了

你知道发生了什么事,我能做些什么来修复它吗

更新:我现在可以始终如一地重现问题。如果我上传了一个带有英文文件名的XLSX文件,上传工作正常;如果是带有西班牙语口音的XLSX文件,上传失败,如上所示

有问题的行是@original_filename.encode!(Encoding::UTF_8)在action_dispatch/http/upload.rb中-然而,文件名应该是有效的unicode,但它显然在传输过程中被损坏了

def create_job params, session: nil
  ...
  job = services['jobs'].create! params.merge(code: code)
  ...
end
I, [2016-03-22T10:12:58.701172 #23116]  INFO -- : Started POST "/jobs" for 80.0.249.70 at 2016-03-22 10:12:58 +0000
F, [2016-03-22T10:12:58.706190 #23116] FATAL -- : Encoding::UndefinedConversionError ("\xC3" from ASCII-8BIT to UTF-8):
  actionpack (4.2.0) lib/action_dispatch/http/upload.rb:31:in `encode'
  actionpack (4.2.0) lib/action_dispatch/http/upload.rb:31:in `initialize'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:51:in `new'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:51:in `normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:57:in `block in normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each_with_object'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:57:in `block in normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `each_with_object'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:53:in `normalize_encode_params'
  actionpack (4.2.0) lib/action_dispatch/http/request.rb:308:in `POST'
  actionpack (4.2.0) lib/action_dispatch/http/parameters.rb:14:in `parameters'
  actionpack (4.2.0) lib/action_dispatch/http/filter_parameters.rb:37:in `filtered_parameters'
  actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:22:in `process_action'
  actionpack (4.2.0) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
  activerecord (4.2.0) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (4.2.0) lib/abstract_controller/base.rb:137:in `process'
  actionview (4.2.0) lib/action_view/rendering.rb:30:in `process'
  actionpack (4.2.0) lib/action_controller/metal.rb:195:in `dispatch'
  actionpack (4.2.0) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.2.0) lib/action_controller/metal.rb:236:in `block in action'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `call'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:42:in `serve'
  actionpack (4.2.0) lib/action_dispatch/journey/router.rb:43:in `block in serve'
  actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `each'
  actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `serve'
  actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:802:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/rack/agent_hooks.rb:30:in `traced_call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/rack/browser_monitoring.rb:23:in `traced_call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/etag.rb:24:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/conditionalget.rb:38:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/head.rb:13:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/flash.rb:260:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.6.1) lib/rack/session/abstract/id.rb:220:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/cookies.rb:560:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  activerecord (4.2.0) lib/active_record/query_cache.rb:36:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  activerecord (4.2.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `call'
  activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `_run_callbacks'
  activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_call_callbacks'
  activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  railties (4.2.0) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.0) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.2.0) lib/rails/rack/logger.rb:20:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/methodoverride.rb:22:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/runtime.rb:18:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  activesupport (4.2.0) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/static.rb:113:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  rack (1.6.1) lib/rack/sendfile.rb:113:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  railties (4.2.0) lib/rails/engine.rb:518:in `call'
  railties (4.2.0) lib/rails/application.rb:164:in `call'
  newrelic_rpm (3.11.1.284) lib/new_relic/agent/instrumentation/middleware_tracing.rb:67:in `call'
  puma (2.11.0) lib/puma/configuration.rb:82:in `call'
  puma (2.11.0) lib/puma/server.rb:507:in `handle_request'
  puma (2.11.0) lib/puma/server.rb:375:in `process_client'
  puma (2.11.0) lib/puma/server.rb:262:in `block in run'
  puma (2.11.0) lib/puma/thread_pool.rb:104:in `call'
  puma (2.11.0) lib/puma/thread_pool.rb:104:in `block in spawn_thread'