Ruby Net::FTP - Загрузка файлов с сервера
Я пытаюсь загрузить определенные файлы с удаленного сервера, используя класс Ruby Net::FTP, вот мой код
require 'net/ftp'
ftp = Net::FTP.new
ftp.connect('mydomain', '21')
ftp.login('username', 'password')
ftp.passive = true
ftp.chdir("testing")
ftp.getbinaryfile('個人情報.csv', 'test1.csv')
puts "#{Time.now} > Downloaded 個人情報.csv."
ftp.getbinaryfile('住所.csv', 'test2.csv')
puts "#{Time.now} > Downloaded 住所.csv"
ftp.close
Я получаю следующие ошибки
$ ruby ftp_download.rb
/usr/local/lib/ruby/2.3.0/net/ftp.rb:340:in `getresp': 451 No mapping for the Unicode character exists in the target multi-byte code page. (Net::FTPTempError)
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:367:in `block in sendcmd'
from /usr/local/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:365:in `sendcmd'
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:424:in `transfercmd'
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:501:in `block (2 levels) in retrbinary'
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:214:in `with_binary'
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:499:in `block in retrbinary'
from /usr/local/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:498:in `retrbinary'
from /usr/local/lib/ruby/2.3.0/net/ftp.rb:632:in `getbinaryfile'
from ftp_download.rb:26:in `<main>'
Файлы tagrget имеют кодировку SJIS.
Что я делаю неправильно? любая помощь высоко ценится! Спасибо
1 ответ
Сообщение об ошибке приходит с FTP-сервера. Проблема в том, что FTP-сервер не может интерпретировать эти имена файлов в Юникоде. Пожалуйста, проверьте, включена ли функция UTF8 для соединения.
Из существующего ответа на stackru:
Недостаточно просто зашифровать вашу строку как UTF8 и отправить ее в качестве имени файла на FTP-сервер. В прошлом все FTP-серверы понимали только ASCII, и в настоящее время для обеспечения обратной совместимости - даже если они поддерживают Unicode - при запуске они рассматривают все файловые элементы также как ASCII.
Чтобы все это заработало, вы (ваша программа) должны сначала проверить, на что способен ваш сервер. Серверы отправляют свои функции после подключения клиента - в вашем случае вы должны проверить FEAT UTF8. Если ваш сервер отправляет это - значит, он понимает UTF8. Тем не менее - даже если он это понимает - вы должны четко указать, что теперь вы будете отправлять свои имена файлов в кодировке UTF8, а теперь это то, чего не хватает вашей программе (поскольку ваш сервер поддерживает utf8, как вы заявили).
Ваш клиент должен отправить на сервер FTP следующие OPTS UTF8 ON. После отправки вы можете использовать UTF8 или говорить (так сказать) на UTF8 со своим сервером.
Подробнее читайте здесь Интернационализация протокола передачи файлов
Источники: