Avatar billede ismar Nybegynder
25. maj 2007 - 13:48 Der er 4 kommentarer

Probemer med upload af filer til ftp server

Jeg har et styk kode som uploder jpg-filer til en FTP server.
Sådan som det er nu, fungerer det fint. Men en gang imellem oplever jeg at applikation stopper midt i processen og ’hænger’. Og det er tit hvis der er flere end 50 filer, der skal uploades. Ftp serveren er hos udbyder og jeg ved at der er åbent for 50 forbindelser. Det tyder på at der laves flere end 50 forbindelser i for-løkken. Det vil jeg gerne undgå, derfor har jeg sidst i løkken denne linie: client.disconnect();
Men det fungerer vist ikke.
Hvis jeg vælger at sætte: client.disconnect(); efter for-løkke, så får jeg NullPointerException I linjen: os.write(b,0,n);

Jeg bruger ’org.apache.commons.net.ftp.FTPClient’ og klassen extends Thread.

Er der nogen, der kan hjælpe?
Her er koden på for-løkken:


….
     
    for(int j = 0; j < filenames.length; j++ ) {
               
                if(!client.isConnected()){
                    client.connect(ftp_server_adress);
                    client.login(ftp_server_username, ftp_server_password);
                }
                System.out.print(client.getReplyString());
               
               
                filename = filenames[j];
//                System.out.println(j+" conect");
                if(j == 0){
                    switch(choise){
                        case 0:  // yes
                            cancel = false;
                            break;
                           
                        case 1:  // no
                            cancel = true;
                            btn_exit.setEnabled(true);
                            btn_select.setEnabled(true);
                            btn_upload.setEnabled(true);
                            break;
                           
                        case 2:  //cancel
                            cancel = true;
                            btn_exit.setEnabled(true);
                            btn_select.setEnabled(true);
                            btn_upload.setEnabled(true);
                            break;
                    }
                }
                if(!cancel){
                    // Bruges kun for at overføre filens navn
                    URL url = new URL(UPLOAD_URL + "?filename=" + URLEncoder.encode(filename, "ISO8859-1") + "&orderOwner=" + URLEncoder.encode(mf.arg_owner, "ISO8859-1") + "&orderNummber=" + URLEncoder.encode(mf.arg_nommber, "ISO8859-1")+ "&orderSystem=" + URLEncoder.encode(mf.arg_system, "ISO8859-1"));
                    HttpURLConnection httpcon = (HttpURLConnection)url.openConnection();
                    httpcon.connect();
                    if(httpcon.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        System.out.println("HttpURLConnection.HTTP_OK er OK.");
                    }
                    httpcon.disconnect();
                   
                    if(j == 0){
                        stMessage.setForeground(new Color(255, 51, 51));
                        stMessage.setText("Vent venligst, upload er i gang . . . ");
                        files.setText("");
                    }
                   
                   
                    InputStream is = new FileInputStream(abs_path + File.separator + filename);
                    client.setFileType(FTPClient.BINARY_FILE_TYPE);
                   
                   
                    try {
                        OutputStream os = client.storeFileStream(UPLOAD_DIR+filename);
                       
                        byte[] b = new byte[10000];
                        int n = 0;
                        while((n = is.read(b)) >= 0) {
                            os.write(b,0,n);
                            STATUS_SUM += n;
                            pbar.setValue(STATUS_SUM);
                        }
                        os.close();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                   
                   
                    is.close();
                   
                    System.out.println(abs_path + File.separator + filename);
                   
                    files.setForeground(Color.GREEN);
                    files.append("Uploadning af filen "+ filename +" er færdig." + "\n");
                   
                    if(j == filenames.length-1){
                        stMessage.setText("Uploadning er færdig.");
                        stMessage.setForeground(new Color(0, 153, 51));
                    }
                }               
                client.disconnect();
            }

….
Avatar billede arne_v Ekspert
25. maj 2007 - 21:54 #1
For det første så prøv med client.storeFile fremfor client.storeFileStream fordi
den første har lidt mere håndtering indbygget end en standard stream copy.
Avatar billede arne_v Ekspert
25. maj 2007 - 21:57 #2
For det andet så prøv:

                if(j % 40 == 39){
                    client_disconnect();
                    client.connect(ftp_server_adress);
                    client.login(ftp_server_username, ftp_server_password);
                }

for at begrænse antal overførsler per FTP session.
Avatar billede ismar Nybegynder
28. maj 2007 - 02:14 #3
Hej arne_v

Jeg har prøvet begge dine forslag, men kunne ikke løse problemet. Nu, har jeg brugt client.logout(), og det fungerer fint(mht. upload af >50 filer).
Men jeg skal logge ud og logge ind igen for hver gennemløb.
Jeg er lidt i tvivl om det er korrekt måde, at gør upload af filer på. 

Et andet problem er, at en gang i mellem får jeg følgende exception i forbindelse med linien: server_files = client.listNames();


org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication.
        at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:267)
        at org.apache.commons.net.ftp.FTP.getReply(FTP.java:605)
        at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1253)
        at org.apache.commons.net.ftp.FTPClient.listNames(FTPClient.java:1971)
        at org.apache.commons.net.ftp.FTPClient.listNames(FTPClient.java:2006)
        at UploadThread.run(UploadThread.java:76)

Kan du hjælpe?


--------------------------------------------------------------

Her er min ny kode for hele run() metode:

    public void run() {
        int STATUS_SUM = 0;
        btn_select.setEnabled(false);
        String server_files[] = null;
        int reply = 0;
        try {
          client.connect(ftp_server_adress);
          client.login(ftp_server_username, ftp_server_password);
           
            if(client.isConnected()){
                client.changeWorkingDirectory(UPLOAD_DIR);
                server_files = client.listNames();
            }
            System.out.print(client.getReplyString());
           
            boolean cancel = true;
            int choise = 0;
            String message = "";
            boolean overwrite = false;
         
            for(int i = 0; i < filenames.length; i++ ) {
                filename = filenames[i];
                filessize = filessize + (int)(new File(abs_path + File.separator + filename)).length();
                if(server_files != null){
                    for(int k=0; k < server_files.length; k++){
                        if(filename.equals(server_files[k])){
                            message = message + "Filen "+ filename +" findes allerede. \n";
                            overwrite = true;
                        }
                    }
                } else{
                    cancel = false;
                }
            }
           
            if(overwrite){
                message = message + "\n Vil du overskrive filen/filerne?";
                choise = optionPane.showConfirmDialog(mf, message);
            }
           
            pbar.setMaximum(filessize);
           
            if(DEBUGGER){
                start = System.currentTimeMillis();
            }
           
            for(int j = 0; j < filenames.length; j++ ) {
               
                if(client.isConnected()){
                    client.logout();
                    client.disconnect();
                }
                if(!client.isConnected()){
                    client.connect(ftp_server_adress);                   
                    client.setFileType(FTPClient.BINARY_FILE_TYPE);
                    client.login(ftp_server_username, ftp_server_password);
                }
               
                System.out.print(client.getReplyString());
               
                // Check the reply code to verify success.
                reply = client.getReplyCode();
                if(!FTPReply.isPositiveCompletion(reply)) {
                    client.disconnect();
                    System.err.println("FTP server refused connection. Code: "+reply);
                }else{
                    if(DEBUGGER){
                        System.out.println(client.sendNoOp());
                    }
                }
               
                filename = filenames[j];
                if(j == 0){
                    switch(choise){
                        case 0:  // yes
                            cancel = false;
                            break;
                           
                        case 1:  // no
                            cancel = true;
                            btn_exit.setEnabled(true);
                            btn_select.setEnabled(true);
                            btn_upload.setEnabled(true);
                            break;
                           
                        case 2:  //cancel
                            cancel = true;
                            btn_exit.setEnabled(true);
                            btn_select.setEnabled(true);
                            btn_upload.setEnabled(true);
                            break;
                    }
                }
                if(!cancel){
                    // Bruges kun for at overføre filens navn
                    URL url = new URL(UPLOAD_URL + "?filename=" + URLEncoder.encode(filename, "ISO8859-1") + "&orderOwner=" + URLEncoder.encode(mf.arg_owner, "ISO8859-1") + "&orderNummber=" + URLEncoder.encode(mf.arg_nommber, "ISO8859-1")+ "&orderSystem=" + URLEncoder.encode(mf.arg_system, "ISO8859-1"));
                    HttpURLConnection httpcon = (HttpURLConnection)url.openConnection();
                    httpcon.connect();
                    if(httpcon.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        System.out.println("HttpURLConnection.HTTP_OK er OK.");
                    }
                    httpcon.disconnect();
                   
                    if(j == 0){
                        stMessage.setForeground(new Color(255, 51, 51));
                        stMessage.setText("Vent venligst, upload er i gang . . . ");
                        files.setText("");
                    }
                   
                    InputStream is = new FileInputStream(abs_path + File.separator + filename);
                   
                    try {
                       
                        OutputStream os = client.storeFileStream(UPLOAD_DIR+filename);
                        byte[] b = new byte[1000];
                        int n = 0;
                        while((n = is.read(b)) >= 0) {
                            os.write(b,0,n);
                            STATUS_SUM += n;
                            pbar.setValue(STATUS_SUM);
                        }
                        os.close();
                       
                       
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    is.close();
                   
                    System.out.println(abs_path + File.separator + filename);
                   
                    files.setForeground(Color.GREEN);
                    files.append("Uploadning af filen "+ filename +" er færdig." + "\n");
                   
                    if(j == filenames.length-1){
                        stMessage.setText("Uploadning er færdig.");
                        stMessage.setForeground(new Color(0, 153, 51));
                    }
                }
            }
            if(client.isConnected()){
                client.logout();
                client.disconnect();
            }
            if(DEBUGGER){
                end = System.currentTimeMillis();
                System.out.println("Execution time for upload: "+(end-start)+" millis");
            }
        }catch (SocketException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        btn_select.setEnabled(true);
       
    }
   
   
   
}
Avatar billede ismar Nybegynder
07. juni 2007 - 14:55 #4
Kunne ikke løse problemet. Nu bruger jeg com.enterprisedt.net.ftp pakken istedet for org.apache.commons.net.ftp og det virker fint.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester