Avatar billede tigertool Nybegynder
07. juni 2004 - 00:08 Der er 1 løsning

Gemme Fil på FTP-server

Jeg er ved at lave et lille program hvor jeg har brug for at gemme en fil på en FTP-server.

Jeg har fået følgende klasse:
<code>
import java.io.*;
import java.net.*;
import java.util.*;

public class FtpForbindelse
{
  private Socket kontrol;
  private PrintStream ud;
  private BufferedReader ind;

  private String læsSvar() throws IOException
  {
    while (true)
    {
      String s = ind.readLine();
      System.out.println(s);
      if (s.length() >= 3 && s.charAt(3) != '-' && Character.isDigit(s.charAt(0)) && Character.isDigit(s.charAt(1)) && Character.isDigit(s.charAt(2)))
      {
        return s;
      }
    }
  }

  public String sendKommando(String kommando) throws IOException
  {
    ud.println(kommando);
    ud.flush();
    return læsSvar();
  }

  public void forbind(String vært, String bruger, String kode)throws IOException
  {
    kontrol = new Socket(vært, 21);
    ud  = new PrintStream(kontrol.getOutputStream());
    ind = new BufferedReader(new InputStreamReader(kontrol.getInputStream()));
    læsSvar();
    sendKommando("USER " + bruger);
    sendKommando("PASS " + kode);
  }

  private Socket skafDataforbindelse() throws IOException
  {
    String maskineOgPortnr = sendKommando("PASV");
    StringTokenizer st = new StringTokenizer(maskineOgPortnr, "(,)");
    if (st.countTokens() < 7) throw new IOException("Ikke logget ind");
    st.nextToken();
    st.nextToken();
    st.nextToken();
    st.nextToken();
    st.nextToken();
    int portNr = 256 * Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken());
    return new Socket(kontrol.getInetAddress(), portNr);
  }

  public void sendTekst(String kommando, String data) throws IOException
  {
    Socket df = skafDataforbindelse();
    PrintStream dataUd = new PrintStream( df.getOutputStream() );
    sendKommando(kommando);
    dataUd.print(data);             
    dataUd.close();
    df.close();
    læsSvar();
  }

  public String modtagTekst(String kommando) throws IOException
  {
    Socket df = skafDataforbindelse();
    BufferedReader dataInd = new BufferedReader(new InputStreamReader(df.getInputStream()));
    sendKommando(kommando);
    StringBuffer sb = new StringBuffer();
    String s = dataInd.readLine();

    while (s != null)
    {
      System.out.println(s);
      sb.append(s+"\n");
      s = dataInd.readLine();
    }

    dataInd.close();
    df.close();
    læsSvar();
    return sb.toString();
  }
}
</code>

Klassen er lavet ud fra bogen "Objektorienteret programmering i Java", Skrevet af Jacob Nordfalk (Virkelig en god bog, kan klart anbefales for nybegyndere)

Mit problem er nu at jeg skal have skrevet en metode hvor jeg har en fil med som parameter, og denne fil skal så gemmes på FTP-Serveren. Jeg har prøvet at sende et objekt af klassen File med, men det holder ikke helt - da jeg ikke ved hvordan dataen skal overføres. Det skal vel overføres i bytes?

Håber nogen kan hjælpe.
Avatar billede tigertool Nybegynder
07. juni 2004 - 00:37 #1
Jeg løste selv problemet med følgende metode:

  public void sendData(String kommando, File data) throws IOException
  {
    Socket df = skafDataforbindelse();
    PrintStream dataUd = new PrintStream(df.getOutputStream());
    sendKommando(kommando);
    dataUd.write(getBytesFromFile(data));
    dataUd.close();
    df.close();
    læsSvar();
  }

Også lige en metode til at konvertere fra File til byte[]:

  public static byte[] getBytesFromFile(File file) throws IOException
  {
    InputStream is = new FileInputStream(file);
    long length = file.length();

    if (length > Integer.MAX_VALUE)
    {
    }

    byte[] bytes = new byte[(int)length];

    int offset = 0;
    int numRead = 0;
   
    while (offset < bytes.length  && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0)
    {
      offset += numRead;
    }

    if (offset < bytes.length)
    {
      throw new IOException("Could not completely read file "+file.getName());
    }

    is.close();
    return bytes;
  }
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