Avatar billede frostware Nybegynder
01. august 2004 - 10:06 Der er 35 kommentarer og
1 løsning

FTP forbindelse i java program

Hej

Er der nogen som kender en class som kan bruges til ftp forbindelse igennem et java program. Det eneste det skal kunne er at downloade en fil og uploade en fil.


mvh
frostware
Avatar billede arne_v Ekspert
01. august 2004 - 10:29 #1
Apache common net har en FTP client.

http://jakarta.apache.org/commons/net/
Avatar billede arne_v Ekspert
01. august 2004 - 10:29 #2
Eksempel med GET:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;

public class FtpGet {
    public static void main(String[] args) {
        FTPClient client = new FTPClient();
        try {
            client.connect("192.168.1.10");
            client.login("anonymous", "arne@");
            InputStream is = client.retrieveFileStream("index.lis");
            OutputStream os = new FileOutputStream("C:\\index.lis");
            byte[] b = new byte[1000];
            int n;
            int total = 0;
            while((n = is.read(b)) >= 0) {
                os.write(b,0,n);
                total += n;
                System.out.println("bytes: " + total);
            }
            os.close();
            is.close();
            client.disconnect();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
01. august 2004 - 10:30 #3
Og et svar
Avatar billede frostware Nybegynder
01. august 2004 - 10:37 #4
hmmmm....skriv lige linket til filen. Jeg kan umidelbart ikke se hvor den kan downloades
Avatar billede arne_v Ekspert
01. august 2004 - 10:38 #5
klik på download og 2-3 klik mere og du ender på:

http://www.apache.org/dist/jakarta/commons/net/binaries/commons-net-1.2.2.zip
Avatar billede frostware Nybegynder
01. august 2004 - 10:51 #6
alle filerne i zip filen er hmtl filer og de kan derfor ikke importes i java. Hvordan gør man
Avatar billede arne_v Ekspert
01. august 2004 - 11:16 #7
Der er en enkelt jar fil i ZIP filen også !

unzip
put commons-net-1.2.2/commons-net-1.2.2.jar i din classpath
import de pakker/klasser du skal bruge
Avatar billede frostware Nybegynder
01. august 2004 - 11:49 #8
det kan jeg ikke. Jeg kan importe frem til ftp mappen, men derefter kan den ikke finde FTPClient
Avatar billede frostware Nybegynder
01. august 2004 - 12:03 #9
har fundet ud af det nu. Jeg får en fejl ved client.connect. Hvad kan det være?
Avatar billede arne_v Ekspert
01. august 2004 - 12:07 #10
Connecter du til den rette adresse ? Er der en FTP server på den adresse ?
Avatar billede frostware Nybegynder
01. august 2004 - 12:08 #11
det er i jBuilder. Programmet kører ikke endnu og kan heller ikke køre da der er en fejl (rød bølget streg) ved connect
Avatar billede arne_v Ekspert
01. august 2004 - 12:24 #12
Når du kører make eller build, hvilken fejl får du så ?
Avatar billede frostware Nybegynder
01. august 2004 - 12:35 #13
Vent lige lidt, nu er det er en lidt anden fejl.

Det eneste man skulle kopiere ind er commons-net-1.2.2.jar filen, ikke??
Hvis du kender jBuilder hvor kopiere man så jar filen hen. Jeg har kopieret den ind i lib mappen.
Avatar billede arne_v Ekspert
01. august 2004 - 12:59 #14
Det er ligegyldigt hvor jar filen ligger.

Du kan tilføjde den til projektet uanset hvor den ligger.
Avatar billede arne_v Ekspert
01. august 2004 - 13:00 #15
project
project properties
required librarries
add
new
angiv name
library path add
Avatar billede frostware Nybegynder
01. august 2004 - 18:18 #16
fino. Et tilsvarende eksempel som sender index.lis til serveren kunne f.eks. være?
Avatar billede arne_v Ekspert
01. august 2004 - 21:41 #17
Hvis du erstatter:

            InputStream is = client.retrieveFileStream("index.lis");
            OutputStream os = new FileOutputStream("C:\\index.lis");

med:

            InputStream is = new FileInputStream("C:\\index.lis");
            OutputStream os = client.storeFileStream("index.lis");

så tror jeg at det går den anden vej !
Avatar billede frostware Nybegynder
01. august 2004 - 22:26 #18
Havde selv fået samme idé men det virker ikke. Efter hvad jeg kan se er det i while løkken det gåt galdt. Nogen idéer?
Avatar billede arne_v Ekspert
01. august 2004 - 22:32 #19
Hvad sker der helt præcist ?

Og du har også rettet FileOutputStream->FileiNputStream og
retrieveFileStream->storeFileStream ?
Avatar billede frostware Nybegynder
01. august 2004 - 22:35 #20
den overfører ca. 2.9kb af filen og så stopper den. Selvom filen fylder 5-6kb. Dvs. at den mangler at overfører ca. det halve.

Som sagt tror jeg det har noget med while løkken at gøre. Måske noget med at den er færdig med at læse på harddisken før den har skrevet til serveren. (men jeg er ikke sikker, bare et gæt :-S)
Avatar billede arne_v Ekspert
01. august 2004 - 22:39 #21
Mystisk.

Hvad sker der hvis du ændrer buffer størrelsen ?

Ned til 100 eller op til 10000 ?
Avatar billede frostware Nybegynder
01. august 2004 - 22:41 #22
ingen forskel
Avatar billede frostware Nybegynder
01. august 2004 - 22:43 #23
lige så vi er enige, bufferen er byte[] b = new byte[1000]; ikke?
Avatar billede arne_v Ekspert
01. august 2004 - 22:48 #24
jep
Avatar billede frostware Nybegynder
01. august 2004 - 22:49 #25
så hjælper det ikke
Avatar billede arne_v Ekspert
01. august 2004 - 22:56 #26
Jeg har lige uploadet 1MB med den her kode:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;

public class FtpPut {
    public static void main(String[] args) {
        FTPClient client = new FTPClient();
        try {
            client.connect("localhost");
            client.login("anonymous", "arne@");
            InputStream is = new FileInputStream("C:\\z.zip");
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            OutputStream os = client.storeFileStream("z.zip");
            byte[] b = new byte[1000];
            int n;
            int total = 0;
            while((n = is.read(b)) >= 0) {
                os.write(b,0,n);
                total += n;
                System.out.println("bytes: " + total);
            }
            os.close();
            is.close();
            client.disconnect();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede frostware Nybegynder
01. august 2004 - 23:09 #27
det er godt nok mystisk. Jeg kan sagtens uploade en exe fil på 700kb, men en htm fil stopper den efter et bestemt antal tegm!
Avatar billede arne_v Ekspert
01. august 2004 - 23:11 #28
Uploader du ascii eller binary ?

Og hvad er den HTML fil lavet med ?
Avatar billede arne_v Ekspert
01. august 2004 - 23:12 #29
Mit gæt er at:
  - du uploader ascii
  - den HTML ikke indeholder linie skift
  - FTP client eller server bliver ked af en linie på >2900 tegn
Avatar billede frostware Nybegynder
01. august 2004 - 23:19 #30
hvis det er de 2900 tegn hvad kan man så gøre
Avatar billede arne_v Ekspert
01. august 2004 - 23:22 #31
Prøv at upload den binært.

Altså med:

client.setFileType(FTPClient.BINARY_FILE_TYPE);

og se om det hjælper.
Avatar billede arne_v Ekspert
01. august 2004 - 23:22 #32
Og om filen virker efter upload.
Avatar billede frostware Nybegynder
01. august 2004 - 23:25 #33
det er det samme som før
Avatar billede frostware Nybegynder
02. august 2004 - 17:32 #34
hvad skal jeg gøre??
Avatar billede arne_v Ekspert
02. august 2004 - 19:06 #35
Godt spørgsmål.

Kan du upload den fil til den server med manuel FTP ?
Avatar billede frostware Nybegynder
02. august 2004 - 21:43 #36
har selv fundet ud af det ved at bruge lidt andre linier.


InputStream is1 = new FileInputStream("index.lis");
client.storeFile("index.lis",is1);
client.disconnect();
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