How to upload binary file with ftplib in Python?

40,020

Solution 1

The issue is not with the command argument, but with the the file object. Since you're storing binary you need to open file with 'rb' flag:

>>> ftp.storbinary('STOR myfile.txt', open('myfile.txt', 'rb'))
'226 File receive OK.'

Solution 2

APPEND to file in FTP.

Note: it's not SFTP - FTP only

import ftplib
ftp = ftplib.FTP('localhost')
ftp.login ('user','password')
fin = open ('foo.txt', 'r')
ftp.storbinary ('APPE foo2.txt', fin, 1)

Ref: Thanks to Noah

Share:
40,020
Teifion
Author by

Teifion

I am a Software Engineer in a UK Car Insurance provider. I mainly work in Python and PHP.

Updated on July 05, 2022

Comments

  • Teifion
    Teifion almost 2 years

    My python2 script uploads files nicely using this method but python3 is presenting problems and I'm stuck as to where to go next (googling hasn't helped).

    from ftplib import FTP
    ftp = FTP(ftp_host, ftp_user, ftp_pass)
    ftp.storbinary('STOR myfile.txt', open('myfile.txt'))
    

    The error I get is

    Traceback (most recent call last):
      File "/Library/WebServer/CGI-Executables/rob3/functions/cli_f.py", line 12, in upload
        ftp.storlines('STOR myfile.txt', open('myfile.txt'))
      File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 454, in storbinary
        conn.sendall(buf)
    TypeError: must be bytes or buffer, not str
    

    I tried altering the code to

    from ftplib import FTP
    ftp = FTP(ftp_host, ftp_user, ftp_pass)
    ftp.storbinary('STOR myfile.txt'.encode('utf-8'), open('myfile.txt'))
    

    But instead I got this

    Traceback (most recent call last):
      File "/Library/WebServer/CGI-Executables/rob3/functions/cli_f.py", line 12, in upload
        ftp.storbinary('STOR myfile.txt'.encode('utf-8'), open('myfile.txt'))
      File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 450, in storbinary
        conn = self.transfercmd(cmd)
      File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 358, in transfercmd
        return self.ntransfercmd(cmd, rest)[0]
      File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 329, in ntransfercmd
        resp = self.sendcmd(cmd)
      File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 244, in sendcmd
        self.putcmd(cmd)
      File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 179, in putcmd
        self.putline(line)
      File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 172, in putline
        line = line + CRLF
    TypeError: can't concat bytes to str
    

    Can anybody point me in the right direction

  • Teifion
    Teifion almost 14 years
    At work at the moment, will test it out when I get home and hopefully all will be grand, thanks!