I would consider one of <trike>three four approaches:
- On each client: Use rsync to upload the file from the client, possibly retrying every five minutes. Rsync can resume transfers that broke instead of starting fresh every time.
- On the server: Use rsync to download the files from the clients on the server, possibly retrying every five minutes. Rsync can resume transfers that broke instead of starting fresh every time.
- On the server: Use File::Copy on the server to copy the file from the client using an Admin Share (\\machine\C$\)
- Push a second Perl executable to the clients that uploads the files. If the client has no network connection, it won't receive the "upload now" command.