2016-09-01 2 views
1

Je suis en train de télécharger certains fichiers à partir d'un serveur distant en utilisant la classe Net :: FTP Ruby est mon code iciRuby Net :: FTP - Le téléchargement de fichiers à partir d'un serveur

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 

Je reçois les erreurs suivantes

$ 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>' 

Les fichiers tagrégés sont codés SJIS.
Qu'est-ce que je fais mal? toute aide très appréciée! Merci

+0

* Les fichiers tagrget sont codés * SJIS Le problème est très probablement le nom de fichier plutôt que le fichier. Contenu. – Leon

+0

@Leon oui le problème est avec les caractères unicode dans le nom de fichier –

+0

Que renvoie 'ftp.list' sur le lieu? –

Répondre

1

Le message d'erreur provient du serveur FTP. Le problème est que le serveur FTP ne peut pas interpréter ces noms de fichiers Unicode. Veuillez vérifier si la fonctionnalité UTF8 est activée pour la connexion.

d'une réponse existante sur stackoverflow:

Il est tout simplement pas assez pour vous de coder votre chaîne comme UTF8 et l'envoyer comme nom de fichier vers le serveur FTP. Par le passé, tous les serveurs FTP ne comprenaient que l'ASCII et aujourd'hui, pour maintenir la compatibilité ascendante - même s'ils sont compatibles avec Unicode - lorsqu'ils commencent, ils traitent tous les fichiers en ASCII. Pour que tout fonctionne, vous (votre programme) devez d'abord vérifier ce que votre serveur est capable de faire. Les serveurs envoient leurs fonctionnalités après que le client se connecte - dans votre cas, vous devez vérifier FEAT UTF8. Si votre serveur l'envoie, cela signifie qu'il comprend UTF8. Néanmoins - même s'il le comprend - vous devez le dire explicitement qu'à partir de maintenant vous enverrez vos noms de fichiers encodés en UTF8 et maintenant c'est le matériel qui manque à votre programme (car votre serveur supporte utf8 comme vous l'avez dit).

Votre client doit envoyer au serveur FTP les éléments suivants OPTS UTF8 ON. Après l'envoi que vous pouvez utiliser UTF8 ou parler UTF8-ish (pour ainsi dire) à votre serveur.

Lisez ici pour plus de détails Internationalization of the File Transfer Protocol

Sources:

https://stackoverflow.com/a/19903611/1305200

https://wiki.filezilla-project.org/Character_Encoding