Pobieranie plików z serwera FTP

0

Mam sobie taką oto metodę

private static boolean copyFileFTP(String server, int port, String userName, String password, String downloadFile, String newFile) {
        FTPClient ftp = new FTPClient();
        FTPFile[] ftpFile;

        OutputStream out = null;


        try {
            //create a new file
            out = new BufferedOutputStream(new FileOutputStream(newFile));

            //connect ftp server
            ftp.connect(server, port);
            boolean connect = ftp.login(userName, password);

            if (connect) {
                System.out.println("Połączenie z ftp jest nawiązane poprawnie");

                ftpFile = ftp.listFiles(downloadFile);

                for (FTPFile f : ftpFile) {
                    ftp.retrieveFile(downloadFile,out);
                }
            }
            else
                System.out.println("Błąd połączenia");

            ftp.disconnect();
            out.close();

            return true;

        } catch (IOException e) {
            e.printStackTrace();
        }


        return false;
    }

i w momencie gdy pobiorę z serwera ftp plik *.jar to owego pliku nie da się uruchomić... ktoś ma pomysł co może być powodem? mam następujący komunikat w momencie próby uruchomienia pliku

Invalid or currupt jarfile
0

Jesteś pewien, że błąd ma coś wspólnego z mechanizmem pobierania z FTP? Wydaje mi się, że próbujesz otworzyć JAR'kę jako plik wykonalny z poziomu Windows Explorer'a.

0

do tej pory tworzyłem plik *.jar i normalnie klikałem na nim dwa razy myszką i się odpalał

wrzuciłem go na serwer ftp i pobrałem (testuje sobie automatyczną aktualizację programu) i ten sam plik, który normalnie działa po pobraniu z ftp już nie działa....

0

Możliwe, że prócz JAR'ki jest potrzebny jeszcze odpowiedni plik MANIFEST.MF

0

problem jest w tym że mimo że pobiera *.jar to jego "wnętrze" jest "puste"...

odnoszę wrażenie że problem jest w dobraniu odpowiedniego strumienia do zapisywania plików?

1

problem rozwiązany trzeba było dodać

ftp.enterLocalPassiveMode();
ftp.setFileType(FTP.BINARY_FILE_TYPE);

dla zainteresowanych pełna metoda pobierająca pliki z serwera FTP

private static boolean copyFileFTP(String server, int port, String userName, String password, String downloadFile, String newFile) {
        FTPClient ftp = new FTPClient();
        FTPFile[] ftpFile;

        OutputStream out = null;


        try {
            //connect ftp server
            ftp.connect(server, port);
            boolean connect = ftp.login(userName, password);

            ftp.enterLocalPassiveMode();
            ftp.setFileType(FTP.BINARY_FILE_TYPE);

            File file = new File((newFile));
            out = new BufferedOutputStream(new FileOutputStream(file));

            if (connect) {
                System.out.println("Połączenie z ftp jest nawiązane poprawnie");

                ftpFile = ftp.listFiles(downloadFile);

                for (FTPFile f : ftpFile) {
                    ftp.retrieveFile(downloadFile,out);
                }
            }
            else
                System.out.println("Błąd połączenia");

            ftp.disconnect();
            out.close();

            return true;

        } catch (IOException e) {
            e.printStackTrace();
        }

        return false;
    }
1

Szkoda, że nie widziałem wątku wcześniej. Parę tygodni temu pisałem program do pobierania plików z serwerów FTP i SFTP. Wiedziałem o konieczności

ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();

jest, moim zdaniem, zbędne.
Jak byś potrzebował, to mogę udostępnić kod do ściągania z serwerów SFTP.

0

mógłbyś zapodać, nigdy nie wiadomo co kiedy się przyda:) akurat aktualnie tylko pobieram z FTP no ale;)

1

Korzystałem z biblioteki jsch (http://www.jcraft.com/jsch/), dokumentacja jest - delikatnie mówiąc - do d**y.
Kod (bez obsługi błędów):

import com.jcraft.jsch.*;
...
private SftpChanel sftp;

JSch ssh = new JSch();
ssh.setKnownHosts(TRUSTED_HOSTS); //TRUSTED_HOSTS to nazwa pliku z listą zaufanych serwerów
Session session = ssh.getSession(user, host, port);                    
session.setPassword(new String(password)); //password to char[] pobrany z pola typu JPasswordField metodą getPassword()
if(trust.isSelected()) //trust to JCheckBox, jeśli jest zaznaczony, to wyjątkowo mamy zaufanie do serwera
{
    Properties config = new Properties(); 
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);                    
}
session.connect();

Channel channel = session.openChannel("sftp");
channel.connect();

sftp = (ChannelSftp) channel;                    
int mode = ChannelSftp.OVERWRITE;
Vector<ChannelSftp.LsEntry> entries = (Vector<ChannelSftp.LsEntry>)sftp.ls(remoteDirectory); //remoteDirecory, to String z nazwą katalogu (pliku) 
//można było pobierać całe katalogi (z podkatalogami), jeśli użytkownik wskaże plik, to kolekcja entries zawiera tylko ten plik
sftp.get(entries.get(0).getFilename(), localDirectory, (SftpProgressMonitor)null, mode);

1 użytkowników online, w tym zalogowanych: 0, gości: 1