ftplib limitations?

Stefan Schwarzer sschwarzer at sschwarzer.net
Wed Aug 25 07:41:27 EDT 2010


Hi durumdara,

On 2010-08-25 11:18, durumdara wrote:
> On aug. 25, 08:07, Stefan Schwarzer <sschwar... at sschwarzer.net> wrote:
>>
>> The file is 2 GB in size and is fully transferred, without
>> blocking or an error message. The status message from the
>> server is '226-File successfully transferred\n226 31.760
>> seconds (measured here), 64.48 Mbytes per second', so this
>> looks ok, too.
>>
>> I think your problem is related to the FTP server or its
>> configuration.
>>
>> Have you been able to reproduce the problem?
> 
> Yes. I tried with saving the file, but I also got this error.
> but: Total COmmander CAN download the file, and ncftpget also can
> download it without problem...

I suppose they do the same as in my former suggestion:
"catching" the error and ignoring it. ;-)

After all, if I understood you correctly, you get the
complete file contents, so with ftplib the download
succeeds as well (in a way).

You might want to do something like (untested):

    import os
    import socket

    import ftputil

    def my_download(host, filename):
        """Some intelligent docstring."""
        # Need timestamp to check if we actually have a new
        #  file after the attempted download
        try:
            old_mtime = os.path.getmtime(filename)
        except OSError:
            old_mtime = 0.0
        try:
            host.download(filename, filename, 'b')
        except socket.error:
            is_rewritten = (os.path.getmtime(filename) != old_mtime)
            # If you're sure that suffices as a test
            is_complete = (host.path.getsize(filename) ==
                           os.path.getsize(filename))
            if is_rewritten and is_complete:
                # Transfer presumably successful, ignore error
                pass
            else:
                # Something else went wrong
                raise

    def main():
        host = ftputil.FTPHost(...)
        my_download(host, "large_file")
        host.close()

If you don't want to use an external library, you can use
`ftplib.FTP`'s `retrbinary` and check the file size with
`ftplib.FTP.size`. This size command requires support for
the SIZE command on the server, whereas ftputil parses the
remote directory listing to extract the size and so doesn't
depend on SIZE support.

Stefan



More information about the Python-list mailing list