Search code examples
pythonftp

Python: Uploading files FTP_TLS- "550 The parameter is incorrect"


I'm trying to connect to an FTP server using TLS and upload a text file. The below code connects to the site just fine, but it's not uploading the file. Instead I'm getting the following error:

Traceback (most recent call last):
  File "X:/HR & IT/Ryan/Python Scripts/ftps_connection_test.py", line 16, in <module>
    ftps.storlines("STOR " + filename, open(filename,"r"))
  File "C:\Python33\lib\ftplib.py", line 816, in storlines
    with self.transfercmd(cmd) as conn:
  File "C:\Python33\lib\ftplib.py", line 391, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 756, in ntransfercmd
    conn, size = FTP.ntransfercmd(self, cmd, rest)
  File "C:\Python33\lib\ftplib.py", line 357, in ntransfercmd
    resp = self.sendcmd(cmd)
  File "C:\Python33\lib\ftplib.py", line 264, in sendcmd
    return self.getresp()
  File "C:\Python33\lib\ftplib.py", line 238, in getresp
    raise error_perm(resp)
ftplib.error_perm: 550 The parameter is incorrect. 

There's probably something really basic I'm missing, my code is below and any help is much appreciated.

import os
from ftplib import FTP_TLS as f

# Open secure connection
ftps = f("ftp.foo.com")
ftps.login(username,password)  
ftps.prot_p()                        

# Create the test txt file to upload 
filename = r"c:\path\to\file"
testFile = open(filename,"w")
testFile.write("Test file with test text")
testFile.close()

# Transfer testFile
ftps.storlines("STOR " + filename, open(filename,"r"))

# Quit connection
ftps.quit()

Solution

  • filename = r"c:\path\to\file"
    

    is the absolute path to a local file. This same value is being passed in the STOR command, i.e.

    ftps.storlines("STOR " + filename, open(filename,"r"))
    

    attempts to perform a STOR c:\path\to\file operation, however, it is unlikely that the path exists on the remote server, and the ftplib.error_perm exception would suggest that you don't have permission to write there (even if it does exist).

    You could try this instead:

    ftps.storlines("STOR " + os.path.basename(filename), open(filename,"r"))
    

    which would issue a STOR file operation and upload the file to the default directory on the remote server. If you need to upload to a different path on the remote server, just add that to STOR.