Avatar billede fc_kongen Nybegynder
21. marts 2009 - 19:59 Der er 28 kommentarer og
1 løsning

ftp download

Hej

Jeg forsøger at downloade fra en ftp server. Får forbindelse og ingen fejlkode men desværre får jeg ikke downloaded filen. Er der nogen som kan se hvad jeg gør forkert eller har i noget kode jeg kan bruge istedet?

public class FTPConnect {
....

    public synchronized boolean downloadFile (String localfilename)
    {
        try{

              InputStream is = ftpClient.getInputStream();
              BufferedInputStream bis = new BufferedInputStream(is);

              OutputStream os = new FileOutputStream(localfilename);
              BufferedOutputStream bos = new BufferedOutputStream(os);

              byte[] buffer = new byte[1024];
              int readCount;
                System.out.println("outside while");
              while( (readCount = bis.read(buffer)) > 0)
              {
                  System.out.println("inside while");
                bos.write(buffer, 0, readCount);
              }
              bos.close();
              is.close (); // close the FTP inputstream
          //  this.succMesg = "Downloaded!";
              System.out.println("now we should have succcesided");

              return true;
        }catch(Exception ex)
        {
          StringWriter sw0= new StringWriter ();
          PrintWriter p0= new PrintWriter ( sw0, true );
          ex.printStackTrace ( p0 );
      //  erMesg = sw0.getBuffer().toString ();

          return false;
        }
    }
....

det er herfra jeg kalder den

            FTPConnect ftp = new FTPConnect();
            ftp.connecToServer();
            ftp.cwd("test");
            boolean stuff = ftp.downloadFile("5011 test.xml");

            if(stuff) {
                System.out.println("success");
            }
            else {
                System.out.println("crap");
            }

            ftp.disconnet();
Avatar billede arne_v Ekspert
21. marts 2009 - 20:14 #1
InputStream is = ftpClient.getInputStream();

ser meget suspekt ud.

Hvis det er Commons Net FTPClient, så:

InputStream is = ftpClient.retrieveFileStream(localfilename);
Avatar billede arne_v Ekspert
21. marts 2009 - 20:15 #2
retrieveFile fremfor retrieveFileStream er iøvrigt nogen gange bedre !
Avatar billede fc_kongen Nybegynder
21. marts 2009 - 20:42 #3
Den smider nu en exception.

java.io.IOException: Stream closed

er det en stream jeg ikke får åbnet.. synes nemlig ikke jeg lukker den nogen steder. Har forresten nu ændret den til retrieveFileStream.

Desuden hvad er forskellen på retriveFile og retrieveFileStream?
Avatar billede arne_v Ekspert
21. marts 2009 - 21:42 #4
Hvilken linie giver den exception.

Med retriveFile giver man den bare filnavn på server og en OutputStream så kopierer den selv data d.v.s. at man sparer løkken.
Avatar billede fc_kongen Nybegynder
21. marts 2009 - 22:12 #5
Min linie System.out.println("outside while"); bliver udført men den kommer ikke ind i while løkken så vil skyde på det er der den smider exception
Avatar billede arne_v Ekspert
21. marts 2009 - 23:43 #6
Hvordan ser koden ud nu ?

Og bruger du PASV ?
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 00:13 #7
public synchronized boolean downloadFile (String localfilename)
    {
        try{

                // Use passive mode as default because most of us are
                // behind firewalls these days.
                ftpClient.enterLocalPassiveMode();
             
              InputStream is = ftpClient.retrieveFileStream(localfilename);
              BufferedInputStream bis = new BufferedInputStream(is);

              OutputStream os = new FileOutputStream(localfilename);
              BufferedOutputStream bos = new BufferedOutputStream(os);

              byte[] buffer = new byte[1024];
              int readCount;
                System.out.println("outside while");
              while( (readCount = bis.read(buffer)) > 0)
              {
                  System.out.println("inside while");
                bos.write(buffer, 0, readCount);
              }
              bos.close();
              is.close (); // close the FTP inputstream
          //  this.succMesg = "Downloaded!";
              System.out.println("now we should have succcesided");

              return true;
        }catch(Exception ex)
        {
          StringWriter sw0= new StringWriter ();
          PrintWriter p0= new PrintWriter ( sw0, true );
          System.out.println(""+ex);
          ex.printStackTrace ( p0 );
      //  erMesg = sw0.getBuffer().toString ();

          return false;
        }
    }

her hvor jeg kalder den fra

            FTPConnect ftp = new FTPConnect();
            ftp.connecToServer();
            ftp.cwd("test");
            boolean stuff = ftp.downloadFile("5011 test.xml");

            if(stuff) {
                System.out.println("blaaa success");
            }
            else {
                System.out.println("crap");
            }

            ftp.disconnet();
Avatar billede arne_v Ekspert
22. marts 2009 - 00:28 #8
Og hvad laver:

            ftp.connecToServer();
            ftp.cwd("test");

?

(ovenstående ser umiddelbart OK ud)
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 10:35 #9
her er hele min ftp klasse.

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

/**
*
* @author mn
*/
public class FTPConnect {
   
    private String server = "XXXX";
    private String user = "XXX";
    private String pass = "XXXX";
    private String account = "XXXX";
    private FTPClient ftpClient = new FTPClient();
    private boolean success = false;

    public FTPConnect() {

    }

    public synchronized void connecToServer() {
        try {
            int reply;
            ftpClient.connect(server);
            System.out.println("Connected to " + server + ".");

            reply = ftpClient.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply))
            {
                ftpClient.disconnect();
                System.err.println("FTP server refused connection.");
                System.exit(1);
            }
        }
        catch (IOException e) {
            if(ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                }
                catch(IOException f) {
                    f.printStackTrace();
                }
            }
            System.out.println("Could not connect to server");
            e.printStackTrace();
            System.exit(1);
        }
        try {
            if(!ftpClient.login(user, pass, account)) {
                System.out.println("Coldn't login to " + server);
            }
            System.out.println("kommer jeg her til");
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }

    public synchronized void cwd (String dir) {
        try {
            ftpClient.cwd(dir);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public synchronized boolean downloadFile (String localfilename)
    {
        try{

                // Use passive mode as default because most of us are
                // behind firewalls these days.
                ftpClient.enterLocalPassiveMode();
             
              InputStream is = ftpClient.retrieveFileStream(localfilename);
              BufferedInputStream bis = new BufferedInputStream(is);

              OutputStream os = new FileOutputStream(localfilename);
              BufferedOutputStream bos = new BufferedOutputStream(os);

              byte[] buffer = new byte[1024];
              int readCount;
                System.out.println("outside while");
              while( (readCount = bis.read(buffer)) > 0)
              {
                  System.out.println("inside while");
                bos.write(buffer, 0, readCount);
              }
              bos.close();
              is.close (); // close the FTP inputstream
          //  this.succMesg = "Downloaded!";
              System.out.println("now we should have succcesided");

              return true;
        }catch(Exception ex)
        {
          StringWriter sw0= new StringWriter ();
          PrintWriter p0= new PrintWriter ( sw0, true );
          System.out.println(""+ex);
          ex.printStackTrace ( p0 );
      //  erMesg = sw0.getBuffer().toString ();

          return false;
        }
    }

    public synchronized boolean stor(File file, String inputStream) throws IOException {
        if (file.isDirectory()) {
          throw new IOException("SimpleFTP cannot upload a directory.");
        }
        // Use passive mode as default because most of us are
        // behind firewalls these days.
        ftpClient.enterLocalPassiveMode();
       
        String filename = file.getName();

        InputStream in = new FileInputStream(inputStream);
        success = ftpClient.storeFile(filename, in);
//      ftpClient.disconnect();
        return success;
    }

    public synchronized void disconnet() {
        try {
            ftpClient.disconnect();
        }
        catch (IOException ex) {
            System.out.println("Connection closed");
        }
    }
}
Avatar billede arne_v Ekspert
22. marts 2009 - 19:39 #10
Mystisk.

Hvis directpry og fil eksisterer, så virker det hos mig.

Jeg får samme fejl som dig, hvis de ikke eksisterer.
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 20:53 #11
Meget underligt... nu spørger jeg måske dumt men hvad skrev du i boolean stuff = ftp.downloadFile("?????");

hvis jeg udkommenter denne
ftp.cwd("test");

og skriver
boolean stuff = ftp.downloadFile("test.xml");

samt lægger filen test.xml på serveren rod. Så får jeg stadig samme fejl.
Avatar billede arne_v Ekspert
22. marts 2009 - 21:00 #12
bare et eksisterende filnavn
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 21:13 #13
så du får kun denne fejl meddelse hvis filen ikke findes?

java.io.IOException: Stream closed
Avatar billede arne_v Ekspert
22. marts 2009 - 21:16 #14
Ja. Eller hvis det dir man cwd'er til ikke findes.
Avatar billede arne_v Ekspert
22. marts 2009 - 21:16 #15
I det tilfælde returnerer ftpClient.retrieveFileStream(localfilename) nemlig null og bis.read giver så den fejl.
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 21:24 #16
host host host... Sorry det var mig som var lidt halv stiv opdager jeg lige.... skrev test.xml men min fil hedder test.xls
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 21:35 #17
Synes dog ikke helt at jeg får filen ned på computeren. Får dog success når jeg køre programmet. Men kan ikke se filen.
Hvor lagde den sig da du fik det til at virke?

Har prøvet at ændre localfilename til "c:\\test\\test.xls" men ser ikke ud til at virke. Eller rettere får desværre ikke filen ned til computeren.

OutputStream os = new FileOutputStream(localfilename);
              BufferedOutputStream bos = new BufferedOutputStream(os);
Avatar billede arne_v Ekspert
22. marts 2009 - 21:44 #18
OutputStream os = new FileOutputStream("c:\\test\\" + localfilename);
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 21:59 #19
Synes nu også jeg gjorde det samme men nu virker det... Mange tak.. Forresten har du en ide om hvorfor jeg får denne besked når jeg åbner mit excel dokument "test.xls cannot be accessed. The file may be read-only or you may be trying to access a read-only location. Or the server the document is stored on may not be responding."

Kan se at filen har samme størrelse som den jeg har hentet fra serveren. Når jeg bare kopire filen over via et ftp program(GUI) så får jeg samme besked. Så det er ikke pga mit program.
Avatar billede arne_v Ekspert
22. marts 2009 - 22:01 #20
Check permissions på filen og det dir som den ligger i.
Avatar billede fc_kongen Nybegynder
22. marts 2009 - 22:07 #21
har højreklikket på filen og valgt egenskaber men her står der ikke nogen specilet unormalt. den er ikke skrivebeskyttet. Er der andre steder jeg skal kigge. Samt er der nogle rettigheder man kan ændre inden man henter filen ned.
Avatar billede arne_v Ekspert
22. marts 2009 - 23:28 #22
Du skal ind i security tabben.
Avatar billede fc_kongen Nybegynder
23. marts 2009 - 10:04 #23
Hey Arne tror jeg har fundet ud af lidt mere. Det går galt når mit program uploader filen til serveren. Har taget en fil og uploaded den til ftp-serveren via en GUI. Herefter hentede jeg den ned igen via mit program og her virker det helt fint. Kan du se hvad der går galt i mit upload eller har du et eksempel som virker eller er bedre?

Smider gerne 60 point ekstra i det hvis du kan hjælpe mig med dette nye problem:)
Avatar billede arne_v Ekspert
24. marts 2009 - 00:42 #24
Jeg kan ikke umiddelbart se noget problem i upload.

Har du checket med et andet FTP program hvordan den uploadede fil ser ud ?
Avatar billede fc_kongen Nybegynder
24. marts 2009 - 08:56 #25
Har prøvet med bare et alm. ftp program (brugte core ftp) og her virker det helt fint. I min kode bruger jeg SimpleFTP. Kender du et andet som er bedre at bruge?
Avatar billede fc_kongen Nybegynder
24. marts 2009 - 10:15 #26
Kan fejlen opstå hvis jeg ikke uploader filen som binary? Har kigget lidt rundt og ser det måske kunne være en mulighed hvorfor det fejler.
Avatar billede fc_kongen Nybegynder
25. marts 2009 - 15:30 #27
Har fået det til at virke nu. Det viser sig at man skal sende det binært, for ellers korrupter den filen. Smider du et svar
Avatar billede fc_kongen Nybegynder
25. marts 2009 - 15:33 #28
og mange tak for hjælpen:)
Avatar billede arne_v Ekspert
25. marts 2009 - 17:37 #29
ok
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