Hello everyone,

I'm currently working on an App that uploads large PDFs to a server. The app 
works fine, but everytime, since the PDFs are so large (25MB), the upload takes 
a while, and usually after let's say 30 or 40 minutes, I get a "socketException 
: broken pipe". I believe that this is due to a timeout or disconnect from the 
server (the server cuts the connection I guess), so I moved the upload routine 
in a loop that has a try / catch. When an exception is thrown, I try to 
reconnect. It works fine. The upload starts where it stopped and completes.

Problem? Well, since the upload is "broken" in two parts (or more if any other 
connection loss occurs), the file uploaded is broken too! I mean that's 
definatley normal and I unerstand why that happens, but what I'd like to know 
is how you can keep the upload on "hold" while trying to reconnect. I just want 
to be able to do a complete upload even if there are reconnections. I want my 
PDF to uploaded completely. Here is the code I have :

// In
inputStream = new FileInputStream(localFile); 

// For upload loop
byte[] bytesIn = new byte[4096];
int read = 0;

// Loop until job is not completed (will try to reconnect if any exception is 
thrown)
boolean completed = false;
while (!completed){
    try{

        // Out
        OutputStream outputStream = ftpClient.storeFileStream(remoteFile);

        // Transfer                    
        while ((read = inputStream.read(bytesIn)) != -1) {
            outputStream.write(bytesIn, 0, read);
            transfered += read;
        }

        // Closing streams
        inputStream.close();
        outputStream.close();

        // Final information
        completed = ftpClient.completePendingCommand();
        if (completed) System.out.println("Done");
        else System.out.println("Failure.");
        completed = true;

    } // end try 
    catch (Exception e) {

        // Telling the user
        System.out.println("Trying to reconnect...");
        Thread.sleep(1000);

        // Try to reconnect
        ftpClient.connect(server, port);
        success = ftpClient.login(user, pass);
        if (success) {
            System.out.println("Connection : OK");
            Thread.sleep(1000);
        } else {
            System.out.println("Failed to connect");
        }

        // Set passive mode and file type to binary
        ftpClient.enterLocalPassiveMode();
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

    } // end catch
} // end loop

Any help will be greatly apreciated! Thanks to the community!

Best regards;

Geoffrey
                                          

Reply via email to