SOLVED: Re: ftplib - uploading files using transfercmd?

Kevin Ollivier kevino at
Tue Mar 23 00:05:48 CET 2004

OK, I finally figured out how to fix my problems with the FTP commands
being issued in the wrong order - after I've finished uploading the
file, I have to call ftplib.voidresp().

Is it possible to get this added as a note to the docs for
ftplib.transfercmd()?  IIUC, you must always call ftp.voidresp() after
uploading a file using transfercmd(), and if that's the case, then I
think it'd be helpful to add a note about it in the ftplib docs so
that the next person to come along and try something like this doesn't
run into the same problem. 



On Thu, 18 Mar 2004 23:17:16 -0800, Kevin Ollivier <kevino at>

>Hi all,
>I've come across a problem that has me stumped, and I thought I'd send
>a message to the gurus to see if this makes sense to anyone else. =) 
>Basically, I'm trying to upload a series of files via FTP. I'm using
>ftplib to do it, and for each file I'm using transfercmd("STOR " +
>myfile) to get the socket, then uploading 4096 bytes at a time and
>providing status updates via a GUI interface. Finally, I close the
>socket, set it to None, then move on to the next file. I'm using
>active FTP to upload.
>The first file uploads just fine, but on the second file I'm
>consistently seeing a weird problem where the response to the PORT
>command (sent by self.makeport()) comes *after* the STOR command is
>sent. The order in which the commands are sent doesn't seem to differ,
>only the order in which the FTP server responds differs. This causes
>the transfercmd() call to see an 'error' because the repsonse to the
>PORT command is a 200, but it expects a response in the 100s. I've
>posted the actual FTP debug calls below. 
>I can resolve the problem by continually re-logging into the server,
>but I'd like to avoid doing that if possible. I've tried setting the
>file mode to binary as well as ASCII with the same results.
>Any clues on what I may be going wrong? Has anyone seen anything like
>this before? I couldn't find anything while googling... TIA for any
>#uploading first file...
>*cmd* u'CWD /newlook/tutorial/'
>*put* u'CWD /newlook/tutorial/\r\n'
>*get* '250 CWD command successful.\r\n'
>*resp* '250 CWD command successful.'
>*cmd* 'TYPE I'
>*put* 'TYPE I\r\n'
>*get* '200 Type set to I.\r\n'
>*resp* '200 Type set to I.'
>item = /newlook/tutorial/pub/working_with_themes.htm
>*cmd* 'PORT 192,168,1,103,13,230'
>*put* 'PORT 192,168,1,103,13,230\r\n'
>*get* '200 PORT command successful.\r\n'
>*resp* '200 PORT command successful.'
>*cmd* u'STOR /newlook/tutorial/pub/working_with_themes.htm'
>*put* u'STOR /newlook/tutorial/pub/working_with_themes.htm\r\n'
>*get* '150 Opening BINARY mode data connection for
>*resp* '150 Opening BINARY mode data connection for
>*cmd* 'TYPE I'
>*put* 'TYPE I\r\n'
>*get* '226 Transfer complete.\r\n'
>*resp* '226 Transfer complete.'
>#uploading second file...
>item = /newlook/tutorial/pub/Changing_Page_Properties_1.htm
>*cmd* 'PORT 192,168,1,103,13,231'
>*put* 'PORT 192,168,1,103,13,231\r\n'
>*get* '200 Type set to I.\r\n'
>*resp* '200 Type set to I.'
>*cmd* u'STOR /newlook/tutorial/pub/Changing_Page_Properties_1.htm'
>*put* u'STOR /newlook/tutorial/pub/Changing_Page_Properties_1.htm\r\n'
>*get* '200 PORT command successful.\r\n'
>*resp* '200 PORT command successful.'
>Traceback (most recent call last):
>  File "F:\oss\eclass\eclass_builder\", line 1083, in
>    self.UploadFiles(ftpfiles)
>  File "F:\oss\eclass\eclass_builder\", line 921, in
>    ftp.UploadFiles()
>  File "F:\oss\eclass\eclass_builder\", line 1908, in
>    self.mysocket ='STOR ' + dir + myitem)
>  File "C:\PYTHON23\lib\", line 345, in transfercmd
>    return self.ntransfercmd(cmd, rest)[0]
>  File "C:\PYTHON23\lib\", line 336, in ntransfercmd
>    raise error_reply, resp
>ftplib.error_reply: 200 PORT command successful.

More information about the Python-list mailing list