Как перезаписать существующий файл на ftp-сервере в ruby? - PullRequest
0 голосов
/ 14 февраля 2012

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

Connected successfully uploading file: /tmp/Mall_bill_extract_20120213_170429_2.csv
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-sftp-2.0.5/lib/net/sftp/operations/upload.rb:313:in `on_open'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `to_proc'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-sftp-2.0.5/lib/net/sftp/request.rb:87:in `call'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-sftp-2.0.5/lib/net/sftp/request.rb:87:in `respond_to'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:948:in `dispatch_request'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:911:in `when_channel_polled'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `to_proc'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/channel.rb:311:in `call'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/channel.rb:311:in `process'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:214:in `preprocess'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:214:in `each'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:214:in `preprocess'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:197:in `process'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:161:in `loop'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:161:in `loop_forever'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:161:in `loop'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-sftp-2.0.5/lib/net/sftp/session.rb:802:in `loop'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@vitality_mall/gems/net-sftp-2.0.5/lib/net/sftp.rb:35:in `start'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/app/controllers/report_purchases_employer_controller.rb:139:in `export_to_bill_csv'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/base.rb:1253:in `send'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/base.rb:1253:in `perform_action_without_filters'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/filters.rb:617:in `call_filters'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/benchmark.rb:293:in `measure'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/rescue.rb:136:in `perform_action_without_caching'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in `perform_action'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in `perform_action'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/base.rb:524:in `send'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/base.rb:524:in `process_without_filters'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/filters.rb:606:in `process_without_session_management_support'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/session_management.rb:134:in `process'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/base.rb:392:in `process'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:183:in `handle_request'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:110:in `dispatch_unlocked'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:123:in `dispatch'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:122:in `synchronize'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:122:in `dispatch'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:132:in `dispatch_cgi'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:39:in `dispatch'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/railties/lib/webrick_server.rb:103:in `handle_dispatch'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/railties/lib/webrick_server.rb:74:in `service'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:162:in `start'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:95:in `start'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:92:in `each'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:92:in `start'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:23:in `start'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/webrick/server.rb:82:in `start'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/railties/lib/webrick_server.rb:60:in `dispatch'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/railties/lib/commands/servers/webrick.rb:66
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/activesupport/lib/active_support/dependencies.rb:153:in `require'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/activesupport/lib/active_support/dependencies.rb:521:in `new_constants_in'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/activesupport/lib/active_support/dependencies.rb:153:in `require'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/vendor/rails/railties/lib/commands/server.rb:49
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
/Users/kamilski81/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
/Users/kamilski81/Sites/pe/rails-apps/vitality_mall/script/server:3
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@global/gems/ruby-debug-ide-0.4.17.beta5/lib/ruby-debug-ide.rb:112:in `debug_load'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@global/gems/ruby-debug-ide-0.4.17.beta5/lib/ruby-debug-ide.rb:112:in `debug_program'
/Users/kamilski81/.rvm/gems/ruby-1.8.7-p352@global/gems/ruby-debug-ide-0.4.17.beta5/bin/rdebug-ide:87
-e:1:in `load'
-e:1

вот код:

begin
  Net::SFTP.start('localhost', 'user', :password=>'pass') do |sftp|
    sftp.upload file_location, "/test/outbound_transactions/#{file_name}"
  end
rescue => ex
  puts ex.backtrace
end

1 Ответ

1 голос
/ 14 февраля 2012

Для безопасности данных вы должны:

  1. Загрузить новый файл во временное имя файла.
  2. Переименуйте оригинал в .bak версию.
  3. Переименуйте вновь загруженную версию в исходное имя.
  4. Удалить оригинал.

Причина этого в том, что вы хотите иметь одну из доступных версий, если по какой-либо причине не удается установить код или соединение.

Это также может обойти проблему, с которой вы столкнулись.

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

Обратная трассировка не очень помогает, потому что мы не получаем сообщение, содержащееся в ex. Вы должны сделать:

puts ex.message

или

puts ex.to_s

до puts ex.backtrace, чтобы получить реальное сообщение.

Код, вызвавший исключение, тоже нам мало что говорит:

# Called when an +open+ request finishes. Raises StatusException if the
# open failed, otherwise it calls #write_next_chunk to begin sending
# data to the remote server.
def on_open(response)
  @active -= 1
  file = response.request[:file]
  raise StatusException.new(response, "open #{file.remote}") unless response.ok?
  [...]

так что puts ex.message поможет вам.

Кроме того, upload является асинхронным, поэтому вы можете добавить wait. Это из документов :

Инициирует загрузку с локального на удаленный асинхронно. Этот метод вернет новый экземпляр Net :: SFTP :: Operations :: Upload и требует, чтобы цикл событий был запущен для продолжения загрузки. См. Net :: SFTP :: Operations :: Upload для полного обсуждения того, как этот метод может быть использован.

  uploader = sftp.upload("/local/path", "/remote/path")
  uploader.wait
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...