Ruby Net::FTP - 从服务器下载文件
Ruby Net::FTP - Downloading files from a server
我正在尝试使用 Ruby 的 Net::FTP class 从远程服务器下载某些文件,这是我的代码
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 编码的。
我究竟做错了什么 ?非常感谢任何帮助!谢谢
错误消息来自 FTP 服务器。问题是 FTP 服务器无法解释这些 unicode 文件名。请检查连接是否启用了UTF8功能。
来自 Whosebug 上的现有答案:
仅仅将字符串编码为 UTF8 并将其作为文件名发送到 FTP 服务器是不够的。在过去,所有 FTP 服务器只理解 ASCII,现在为了保持向后兼容性 - 即使它们支持 Unicode - 当它们启动时,它们也将所有文件名都视为 ASCII。
要使其全部正常工作,您(您的程序)必须首先检查您的服务器的能力。服务器在客户端连接后发送它们的功能 - 在您的情况下,您必须检查 FEAT UTF8。如果您的服务器发送它 - 这意味着它理解 UTF8。然而 - 即使它理解它 - 你必须明确地告诉它从现在开始你将发送你的文件名 UTF8 编码,现在它是你的程序缺少的东西(因为你的服务器支持 utf8 正如你所说的那样)。
您的客户端必须向 FTP 服务器发送以下 OPTS UTF8 ON。发送后,您可以使用 UTF8 或说 UTF8-ish(可以这么说)到您的服务器。
阅读此处了解详情Internationalization of the File Transfer Protocol
来源:
我正在尝试使用 Ruby 的 Net::FTP class 从远程服务器下载某些文件,这是我的代码
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 编码的。
我究竟做错了什么 ?非常感谢任何帮助!谢谢
错误消息来自 FTP 服务器。问题是 FTP 服务器无法解释这些 unicode 文件名。请检查连接是否启用了UTF8功能。
来自 Whosebug 上的现有答案:
仅仅将字符串编码为 UTF8 并将其作为文件名发送到 FTP 服务器是不够的。在过去,所有 FTP 服务器只理解 ASCII,现在为了保持向后兼容性 - 即使它们支持 Unicode - 当它们启动时,它们也将所有文件名都视为 ASCII。
要使其全部正常工作,您(您的程序)必须首先检查您的服务器的能力。服务器在客户端连接后发送它们的功能 - 在您的情况下,您必须检查 FEAT UTF8。如果您的服务器发送它 - 这意味着它理解 UTF8。然而 - 即使它理解它 - 你必须明确地告诉它从现在开始你将发送你的文件名 UTF8 编码,现在它是你的程序缺少的东西(因为你的服务器支持 utf8 正如你所说的那样)。
您的客户端必须向 FTP 服务器发送以下 OPTS UTF8 ON。发送后,您可以使用 UTF8 或说 UTF8-ish(可以这么说)到您的服务器。
阅读此处了解详情Internationalization of the File Transfer Protocol
来源: