01. november 2004 - 16:42Der er
13 kommentarer og 1 løsning
Kopiering af fil via java
Jeg er ved at skrive en ftpklient. Den har en metode upload() som skal kunne sende forskellige filer. Indtil videre kan den uden problemer sende forskellige tekstbaserede filer.
Men skal den sende for eksempel en .jpg-fil eller lignende så hænger applikationen bare. Debugging afslører at det er nede i whileløkken den kommer til at hænge. Men hvorfor den gør det kan jeg ikke gennemskue.
Hvad skal jeg ændre i min kode for at den kan sende alle filtyper?
public void upload() throws Exception { forbindDatasocketTilServer(); File testfil = new File("D:\\logfil.txt"); String filnavn = testfil.getName(); DataOutputStream dos = new DataOutputStream(datasocket.getOutputStream());
public void sendFil(File filinput) throws Exception { FileInputStream fis = new FileInputStream(filinput); DataOutputStream dos = new DataOutputStream(datasocket.getOutputStream()); byte[] buf = new byte[1024]; int i = 0; System.out.print ("Forsøger at sende fil...\n"); while((i=fis.read(buf))!=-1) { dos.write(buf, 0, i); } fis.close(); }
Jeg ved ikke med sikkerhed om det er noget med while der gør at den hænger, men det var så langt jeg kunne debugge. Og jo DataOutputStream var unødvendig. OutputStream kan gøre det samme. Det gør dog ingen forskel i forhold til problemet.
Det burde altså være muligt at sende ikke-tekst-filer med denne kode? Mit problem ligger ikke i et eller andet jeg har lavet galt i med streamstyperne?
Har du en idé til hvad jeg evt. kunne researche for at lære hvordan man gør?
Ja, jeg har min egen ftp-server som ligger på en anden computer. Den er ganske standard(G6 FTP). Der har jeg en testkonto og jeg kan logge på via fjernadministration og tjekke logfilen. FTP-serveren ser ikke ud til at have nogle problemer. Har også prøvet andre ftp-servere, men med samme resultat.
Ved debugging har jeg fundet ud af at der går ca. 10 minutter efter at operationen;
os.write(buf, 0, i);
har fejlet efter at den overskred dens mystiske grænse på 32768 bytes. Derefter smider den en exception:
Connection reset by peer: socket write error
Min kontrolsocket ser umiddelbart ud til at virke fint. Den sender serversvarene tilbage så jeg kan læse dem, men det er jo også i tekstformat og der er ingen problemer med at sende og modtage i tekstformat. Hverken på kontrolsocket eller datasocket.
Jeg har prøvet at sætte TYPE I i stedet for TYPE A, men det gør ingen forskel. Binære filer går stadig ikke igennem og tekstfiler går fint igennem uanset hvilke af de 2 TYPE jeg sætter den til.
Jeg har fundet en løsning. Her er den endelige kode:
public void upload(String sti) { ftpSendKommando("TYPE I"); File fil = new File(sti); String filnavn = fil.getName(); forbindDatasocketTilServer(); ftpSendKommando("STOR " + filnavn); try { sendFil(fil); datasocket.close(); } catch(Exception e) { System.out.println("Fejl i FTPKlient, metode upload: " + e); } ftpSendKommando("NOOP"); }
private void sendFil(File filinput) throws Exception { FileInputStream fis = new FileInputStream(filinput); int filstørrelse = fis.available(); long fillængde = filinput.length(); int filposition = 0; byte[] buf = new byte[4096]; int i = 0; System.out.print ("Forsøger at sende fil...\n"); while((i=fis.read(buf))!=-1) { try { dataudstrøm.write(buf, 0, i); dataudstrøm.flush(); filposition += i; } catch(Exception e) { System.out.println("Fejl i FTPKlient, metode sendFil: " + e); } } dataudstrøm.close(); fis.close(); }
Problemet var tilsyneladende at når man sender en binær fil, så kan man ikke sætte STOR-kommandoen efter skrivningen til outputstrømmen. Den skal simpelthen komme før. Det er det hele. Og det virker lige godt med både tekst- og binære filer.
Smid et svar så får du pointene Arne. Som tak for din tid.
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.