You will find an LWP example in this chapter of the O'reily Spidering Hacks book. With Net::FTP you can get the size easily using the size() method. There is a hash method that prints hashes every X bytes so the hook you need is kinda there, the problem is that the only way to get at it is to hack the source/or override the get() method in Net::FTP.pm with a modified routine that has a suitable callback hook. Either that or (speculates) pass the get method a tied file handle that lets you tail the writing to it by Net::FTP.