Pobieranie plików z serwera FTP

Pobieranie plików z serwera FTP
R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
0

Mam sobie taką oto metodę

Kopiuj
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

Kopiuj
Invalid or currupt jarfile
opax92
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 4 lata
  • Postów:22
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.

edytowany 1x, ostatnio: opax92
R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
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....

opax92
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 4 lata
  • Postów:22
0

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

R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
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?

R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
1

problem rozwiązany trzeba było dodać

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

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

Kopiuj
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;
    }
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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

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

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


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
0

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

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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):

Kopiuj
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);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.