473,382 Members | 1,611 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,382 software developers and data experts.

ftplib - uploading files using transfercmd?

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
help!

Kevin

#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
/newlook/tutorial/pub/working_with_themes.htm.\r\n'
*resp* '150 Opening BINARY mode data connection for
/newlook/tutorial/pub/working_with_themes.htm.'
*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\editor.py", line 1083, in
UploadPage
self.UploadFiles(ftpfiles)
File "F:\oss\eclass\eclass_builder\editor.py", line 921, in
UploadFiles
ftp.UploadFiles()
File "F:\oss\eclass\eclass_builder\editor.py", line 1908, in
UploadFiles
self.mysocket = self.host.transfercmd('STOR ' + dir + myitem)
File "C:\PYTHON23\lib\ftplib.py", line 345, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\PYTHON23\lib\ftplib.py", line 336, in ntransfercmd
raise error_reply, resp
ftplib.error_reply: 200 PORT command successful.
Jul 18 '05 #1
5 7807
Kevin Ollivier <ke****@tulane.edu> writes:
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
help! Kevin #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
/newlook/tutorial/pub/working_with_themes.htm.\r\n'
*resp* '150 Opening BINARY mode data connection for
/newlook/tutorial/pub/working_with_themes.htm.' * >*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\editor.py", line 1083, in
UploadPage
self.UploadFiles(ftpfiles)
File "F:\oss\eclass\eclass_builder\editor.py", line 921, in
UploadFiles
ftp.UploadFiles()
File "F:\oss\eclass\eclass_builder\editor.py", line 1908, in
UploadFiles
self.mysocket = self.host.transfercmd('STOR ' + dir + myitem)
File "C:\PYTHON23\lib\ftplib.py", line 345, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\PYTHON23\lib\ftplib.py", line 336, in ntransfercmd
raise error_reply, resp
ftplib.error_reply: 200 PORT command successful.


I suspect the problem is in the bit marked with *. You are somehow sending
out a new FTP command before the previous was finished. The 226 belonged to
the transfer command but was eaten by the TYPE command, leaving a dangling
response to the TYPE command. Are you perhaps not waiting for the retrbinary
method to finish before sending another? Remember, there is more for
retrbinary to read after it has called the callback for the last time so you
must wait for it to finish.

Eddie
Jul 18 '05 #2
Kevin Ollivier <ke****@tulane.edu> wrote in message news:<ti********************************@4ax.com>. ..
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.


Kevin, when you make a socket connection to the server, are you used
blocking or non-blocking? A blocking connection won't proceed until
it gets a response, while the non-blocking will - and perhaps your
problem lies there. your 2nd command gets a response before the first
one comes back.

Does indeed your problem only happen at the beginning, or can it
happen anywhere in your list of files?

S
Jul 18 '05 #3
On 19 Mar 2004 06:24:13 -0800, st*****@midwinter.ca (Stewart
Midwinter) wrote:
Kevin Ollivier <ke****@tulane.edu> wrote in message news:<ti********************************@4ax.com>. ..
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.
Kevin, when you make a socket connection to the server, are you used
blocking or non-blocking? A blocking connection won't proceed until
it gets a response, while the non-blocking will - and perhaps your
problem lies there. your 2nd command gets a response before the first
one comes back.


I am using whatever method ftplib uses by default, in other words, I
do not explicitly set the socket as blocking or non-blocking.

After reading your reply (and the other I received), I tried
explicitly calling setblocking(1) on both the FTP socket (ftp.sock)
and the socket that is returned when I call transfercmd. However, the
PORT call's response still comes after the STOR command. (As far as I
could tell, setting blocking mode seemed to do nothing.)
Does indeed your problem only happen at the beginning, or can it
happen anywhere in your list of files?


It does always happen at the beginning, even when uploading to
different servers. But since I cannot get it to upload more than the
first file, I do not know if it would happen at other points in the
upload.

Thanks for your help!

Kevin
Jul 18 '05 #4
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.

Thanks,

Kevin

On Thu, 18 Mar 2004 23:17:16 -0800, Kevin Ollivier <ke****@tulane.edu>
wrote:
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
help!

Kevin

#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
/newlook/tutorial/pub/working_with_themes.htm.\r\n'
*resp* '150 Opening BINARY mode data connection for
/newlook/tutorial/pub/working_with_themes.htm.'
*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\editor.py", line 1083, in
UploadPage
self.UploadFiles(ftpfiles)
File "F:\oss\eclass\eclass_builder\editor.py", line 921, in
UploadFiles
ftp.UploadFiles()
File "F:\oss\eclass\eclass_builder\editor.py", line 1908, in
UploadFiles
self.mysocket = self.host.transfercmd('STOR ' + dir + myitem)
File "C:\PYTHON23\lib\ftplib.py", line 345, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\PYTHON23\lib\ftplib.py", line 336, in ntransfercmd
raise error_reply, resp
ftplib.error_reply: 200 PORT command successful.


Jul 18 '05 #5
Kevin Ollivier <ke****@tulane.edu> writes:
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.


It's more complicated than that. You have to be aware that FTP commands
generate responses, sometimes multiple responses but I think that's so rare
you can ignore it. Most of the ftplib commands hide this, when I replied to
the first post, I could see that the problem was probably that you weren't
eating your responses, unfortunately I didn't read your message carefully
enough to notice you were calling transfercmd directly (tsk tsk) and hence my
explanation was crap (sorry). In general you will often need to know what the
response actually is, however neither of the response gathering methods is
exposed, which is probably worth remedying.

Which brings me to the observation in that in such cases it's often best just
to look at the source. I had a similar problem when trying to turn an FTP
call into a generator but soon noticed all those calls to voidresp.

However it's probably worth trying to get the documentation augmented to
remind users that transfercmd may need to handle responses and to request that
at least getresp be added as a public interface. I think there's a
special mail address for such requests but I'm too lazy^H^H^H^Hbusy to look it
up just now.

Eddie
Jul 18 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Mariela | last post by:
I am trying to run the following C# code: ---------------------------------------- String uriString = "http://10.1.1.100/images/"; WebClient myWebClient = new WebClient(); string fileName =...
2
by: Dany | last post by:
Hi I was wondering wether it was possible to upload files to a server using only ASP (without external components, such as "AspSmartUpload") and te code might look like Thank you -Dany
3
by: darin dimitrov | last post by:
Hello, I have the following Html form: <form name="submitForProcess" action="http://localhost/xml/process.aspx" method="post" enctype="multipart/form-data"> <input type="text"...
0
by: pbd22 | last post by:
Hi. I am having a really tough time here and would appreciate some help. i am using an iFrame to pass a url string of files to upload to server. on the client i have created a multiple...
1
JAMBAI
by: JAMBAI | last post by:
How to upload files in ASP.NET along with Virus scan simillar to mail attachments in yahoo,gmail or any other mailing system. Thanks Jambai
3
by: mollymalone | last post by:
im trying to upload a file using php and apache and i get a blank screen when i submit the file. the php and apache are configured correct as i can open a test php file and as the file i want to...
1
by: tregewitz | last post by:
I am uploading a zip file using an HttpWebRequest and a PUT operation to Sharepoint (2003) from a Windows Form application. When I upload the same file using the Sharepoint Portal Web UI itself,...
0
by: LoriFranklin | last post by:
I'm a bit of a newbie here. I've learned a lot from reading the posts you all have here. I need some help uploading files using an asp form. I am using some code that I found from Jacob at...
1
by: govind161986 | last post by:
When i execute the below mentioned code in .NET 1.1 i get the following error message "A socket operation was attempted to an unreachable host" but when i execute the same code in .NET 2.0 it...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.