Для безопасности данных вы должны:
- Загрузить новый файл во временное имя файла.
- Переименуйте оригинал в
.bak
версию.
- Переименуйте вновь загруженную версию в исходное имя.
- Удалить оригинал.
Причина этого в том, что вы хотите иметь одну из доступных версий, если по какой-либо причине не удается установить код или соединение.
Это также может обойти проблему, с которой вы столкнулись.
Я видел, как 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