2015-01-19 9 views
7

Python non riesce durante il caricamento di un file di dimensioni superiori a 8192 byte. E l'eccezione è solo "ha ottenuto più di 8192 byte". C'è una soluzione per caricare file più grandi.Errore libreria FTP: ottenuto più di 8192 byte

try: 
    ftp = ftplib.FTP(str_ftp_server) 
    ftp.login(str_ftp_user, str_ftp_pass) 
except Exception as e: 
    print('Connecting ftp server failed') 
    return False 

try: 
    print('Uploading file ' + str_param_filename) 
    file_for_ftp_upload = open(str_param_filename, 'r') 
    ftp.storlines('STOR ' + str_param_filename, file_for_ftp_upload) 

    ftp.close() 
    file_for_ftp_upload.close() 
    print('File upload is successful.') 
except Exception as e: 
    print('File upload failed !!!exception is here!!!') 
    print(e.args) 
    return False 

return True 
+0

Il file contiene testo? In caso contrario, probabilmente vorrai aprire in modalità binaria e usare ['ftp.storbinary()'] (https://docs.python.org/2/library/ftplib.html#ftplib.FTP.storbinary). – augurar

risposta

7

storlines legge un testo riga del file uno alla volta, e 8192 è la dimensione massima di ogni linea. Probabilmente stai meglio usare, come il cuore della vostra funzione di upload:

with open(str_param_filename, 'rb') as ftpup: 
    ftp.storbinary('STOR ' + str_param_filename, ftpup) 
    ftp.close() 

Questa legge e memorizza in binario, un blocco alla volta (la stessa di default del 8192), ma dovrebbe funzionare bene per i file di qualsiasi dimensione.

+0

Funziona, grazie mille. – bahtiyartan

+0

Attenzione a questa soluzione se i sistemi di invio e ricezione sono di tipi diversi. L'invio come binario non tradurrà automaticamente la codifica dei caratteri ecc. Tra diversi tipi di sistemi. Le modalità binarie e di testo potrebbero avere un comportamento diverso. – stenix

+0

@stenix, se non vuoi caricare effettivamente il file così com'è (che è esattamente la richiesta dell'OP di "caricare un file" implicita!), Ma piuttosto devi applicare qualsiasi tipo di traduzione, quindi ovviamente tu bisogno di codice molto diverso da quello per il solo caricamento - ampiamente variabile a seconda della traduzione WHAT di cui hai bisogno, naturalmente. –

0

Ho avuto un problema simile e l'ho risolto aumentando il valore della variabile maxline di ftplib. Puoi impostarlo su qualsiasi valore intero che desideri. Rappresenta il numero massimo di caratteri per riga nel file. Questo riguarda il caricamento e il download.

Si consiglia di utilizzare ftp.storbinary nella maggior parte dei casi per la risposta di Alex Martelli, ma non era un'opzione nel mio caso (non la norma).

ftplib.FTP.maxline = 16384 # This is double the default value 

Basta chiamare quella linea in qualsiasi punto prima di iniziare il trasferimento del file.

Problemi correlati