Programmazione Python > Programmazione in rete - web

Upload di un file su altervista.org

(1/1)

laschil:
Non mi fa scrivere l'oggetto: FTP
Buongiorno ho la necessità di inviare un file txt sul mio sito postato su altervista.
Ho seguito le indicazioni del tutorial su: https://www.worthwebscraping.com, ebbene se faccio
la prova con il sito: dlptest.com, tutto funziona. Riesco a fare upload ed anche il donwload.
Non appena metto le credenziali del mio sito ricevo questo errore:
****************************************************************************************
Traceback (most recent call last):
  File "C:/ftppy/ftpaiaz.py", line 9, in <module>
    ftp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASS)
  File "C:\Program Files\lib\ftplib.py", line 119, in __init__
    self.connect(host)
  File "C:\Program Files\lib\ftplib.py", line 160, in connect
    self.welcome = self.getresp()
  File "C:\Program Files\lib\ftplib.py", line 242, in getresp
    resp = self.getmultiline()
  File "C:\Program Files\lib\ftplib.py", line 228, in getmultiline
    line = self.getline()
  File "C:\Program Files\lib\ftplib.py", line 210, in getline
    line = self.file.readline(self.maxline + 1)
  File "C:\Program Files\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 104: invalid continuation byte
*************************************************************************************************
Il codice da me usato è:
import ftplib
FTP_HOST = "ftp.aiazzone.altervista.org"
FTP_USER = "aiazzone"
FTP_PASS = "***********"
# connect to the FTP server
ftp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASS)
# force UTF-8 encoding
ftp.encoding = "utf-8"
# local file name you want to upload
filename = "file.txt"
with open(filename, "rb") as file:
   # use FTP's STOR command to upload the file
    ftp.storbinary("STOR file.txt", file)
# the name of file you want to download from the FTP server
filename = 'file.txt'
with open(filename, "wb") as file:
    # use FTP's RETR command to download the file
    ftp.retrbinary("RETR file.txt", file.write)
# list current files & directories
ftp.dir()
# quit and close the connection
ftp.quit()
--- Termina codice ---

Grazie in anticipo per un eventuale aiuto.
Lanfranco Schillaci
laschil@gmail.com

nuzzopippo:

--- Citazione da: laschil - Febbraio 14, 2021, 08:15 ---...
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 104: invalid continuation byte...

--- Termina citazione ---

Indipendentemente dal codice, la parte evidenziata in rosso mi fa sembrare evidente che sei in presenza di un problema di codifica, probabilmente ciò che tenti di leggere non è codificato in formato utf-8, prova a commentare l'istruzione 
ftp.encoding = "utf-8"
--- Termina codice ---

in maniera da fagli leggere con la codifica di defaul (credo sia la ISO-8859-1), se non funziona neanche così prova ad utilizzare la codifica ascii.

laschil:
Innanzitutto grazie per la risposta. Ho fatto come hai detto tu ho commentato la riga dell'encoding ma non è cambaito l'errore.
Ho trovato su stackoverflow qualcosa di simile ma anche cambiando la codifica in utf-8 senza bom le cose no cambiano.
Proverò ma è strano che succeda. Filezilla me lo uploada.
Grazie ancora proverò più tardi.

nuzzopippo:
Guardando bene il traceback, vedo che l'errore deriva direttamente dalla azione di connessione, l'istruzione sull'encoding è successiva ... forse sono proprio le impostazioni di default di ftplib a non andare bene, potresti provare a definire l'encoding da utilizzare direttamente in quella istruzione, modificando
tp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASS)
--- Termina codice ---

in
tp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASS, encoding='utf-8')
--- Termina codice ---

come nella docs del 3.9.1
[edit] mi è caduta la connessione mentre modificavo con quanto segue :
ovviamente, lo utf-8 è solo indicativo, non necessariamente "giusto", se possibile verifica quale codifica lato server risulta a filezilla, altra cosa, poi, sarebbe accertarsi se le impostazioni che utilizzi nelle connessioni riuscite effettuate con filezilla siano tutte presenti nel tentativo di connessione tramite ftplib.

N.B. : verificando nella mia installazione (Linux, libreria python 3.8.5) vedo che lo encoding è indicato come "Latin-1"
|  ----------------------------------------------------------------------
     |  Data and other attributes inherited from FTP:
     | 
     |  debugging = 0
     | 
     |  encoding = 'latin-1'
     | 
     |  file = None

--- Termina codice ---

"suppongo" siano le impostazioni di default, verifica la Tua libreria ("help('ftplib')" in una shell python), potrebbe essere significativo per il Tuo problema.

Segnalo questa discussione su stackoverflow

laschil:
Grazie ancora per l'aiuto sono riuscito a risolvere grazie ai tuoi suggerimenti, ieri ho accodato nella connessione la stringa encoding="Latin 1" e adesso funziona.
ecco il codice per il messaggio di benvenuto e la list dei files:

from ftplib import FTP


host = 'ftp.aiazzone.altervista.org'
user = 'aiazzone'
passwd = '**********'

with FTP(host,user,passwd,encoding='Latin-1') as ftp:
    print(ftp.getwelcome())
    ftp.dir()


--- Termina codice ---

Ancora grazie per l'aiuto prezioso.
Lanfranco Schillaci
laschil@gmail.com

Navigazione

[0] Indice dei post

Vai alla versione completa