Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 13:54 Der er 18 kommentarer og
1 løsning

Upload Applet

Hej

Jeg er nybegynder med java, men har brug for det til en upload funktion på en hjemmeside, så tænkte at det bare er at komme igang.

Jeg skal kunne uploade minimum 50MB hvilket kræver en ftp forbindelse ved mit webhotel.

Og med hjælp fra andre indlæg her på eksperten er jeg nået langt. Har faktisk lavet et program hvor jeg kan vælge en fil, og sende den med FTP, dog ikke helt stabilt endnu. Men fandt et større problem nemlig at der lige er en lille hage ved mit program, nemlig at det ikke var en applet, og har så fundet ud af at applet og fil styring ikke er en god blanding.

Men ifølge http://www.eksperten.dk/spm/558672 skulle det jo kunne lade sig gøre..

Men mangler bare lige slutningen.... Håber nogen vil hjælpe måske Arne_V.....
Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 15:35 #1
Nu kan jeg også sign en class... efter jeg har set lidt på følgende side:

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed.html

Så nu tilbage til mit program og se om jeg kan sign det også, og måske virker det så....
Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 17:48 #2
Ny status...

Jeg har nu et applet hvor jeg kan vælge en fil, og uploade den via ftp.

Men jeg vil gerne kunne vise en status mens den oploades, med hvor langt den er nået...

Men mit explore window fryser mens jeg uploader...
Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 18:33 #3
andet problem er at det ikke er hele filen der bliver uploadet, den nederste af billedet mangler, ved jpg og andre filer kan ikke åbnes nok pga der mangler noget af dem.

Koden som er klippet her fra eksperten:

    public void upload(String dirname, String filename) {
    FTPClient client = new FTPClient();
        try {
            client.connect("adresse");
            client.login("username", "password");
            InputStream is = new FileInputStream(dirname + File.separator + filename);
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            OutputStream os = client.storeFileStream("z.jpg");
            byte[] b = new byte[1000];
            int n;
            int total = 0;
            while((n = is.read(b)) >= 0) {
                os.write(b,0,n);
                total += n;
            }
            os.close();
            is.close();
            client.disconnect();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 18:41 #4
Efter jeg har kikket lidt her: http://wiki.apache.org/commons/Net/FrequentlyAskedQuestions

Har jeg rettet lidt i min kode:

byte buf[] = new byte[8192];
int bytesRead = is.read(buf);
while (bytesRead != -1) {
  os.write(buf, 0, bytesRead);
  bytesRead = is.read(buf);
}

og nu kommer hele filen igennem.

Så nu har jeg kun et problem... vil gerne kunne se en status mens der uploades...
Avatar billede thesurfer Nybegynder
12. maj 2008 - 18:55 #5
Kan du aflæse den lokale fils størrelse, inden påbegyndelsen af upload? (dvs, efter valg af fil)

Hvis ja, skulle det ikke være noget problem, med simpel matematik, at udregne forskellen mellem filens størrelse, og det der er blevet "kørt igennem" (uploadet)..
Avatar billede thesurfer Nybegynder
12. maj 2008 - 19:02 #6
PS: Formlen er


p = 100 - ( ( (max - uploadet) * 100) / max )

hvor

- "max" er filens (maksimale) størrelse (den der skal aflæses ved valg af fil, før upload)

- "upladet" er den mængde der er blevet uploadet (værdien skal aflæses under upload af filen)


Jeg smutter nu.. er nok tilbage senere i aften..
Avatar billede thesurfer Nybegynder
12. maj 2008 - 19:02 #7
..og "p" er "procent".. :-)
Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 19:24 #8
Ved faktisk ikke om jeg kan se filen størrelse, men det tror jeg da.

Problemet er at appleten fryser mens jeg uploader, hvilket betyder jeg ikke kan skrive noget...
Avatar billede arne_v Ekspert
12. maj 2008 - 20:00 #9
Adgang til fil systemet paa client PC kraver naturligvis at applet skal signes
og godkendes af bruger.

(ellers overvej en applet der sletter file !)

Du skal vaere opmaerksom paa at Vista med IE putter endnu et sikkerheds lag
imellem, saa selv signing ikke er nok.

Jeg har svaert ved at tro at der er forskel paa de 2 while loekker.

Men med nogen FTP servere virker storeFile bedre end storeFileStream (storeFile har
en while loekke med lidt ekstra logik i).

if(client.storeFile("z.jpg", is)) {
    // upload OK
} else {
  // problem
}

Du kan laese en fils stoerrelse med:

(new File(filnavn)).length()

Grunden til at den fryser er formentligt at du udfoerer upload i event traad. Det laaser
hele GUI.

Du skal starte en separat traad of koere upload i denne.
Avatar billede arne_v Ekspert
12. maj 2008 - 20:05 #10
Nedenstaaende kode kopierer en fil med progress bar (det er ikke en applet, men
teknikken vil vaere den samme i en applet):

import java.awt.*;
import java.io.*;

import javax.swing.*;

public class CopyProgress extends JFrame {
    public JProgressBar pbar;
    public CopyProgress() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        pbar = new JProgressBar();
        getContentPane().add(pbar, BorderLayout.CENTER);
        pack();
    }
    public static void main(String[] args) {
        CopyProgress cp = new CopyProgress();
        cp.setVisible(true);
        CopyThread cpthread = new CopyThread("C:\\z.1", "C:\\z.2", cp.pbar);
        cpthread.start();
    }
}

class CopyThread extends Thread {
    private String from;
    private String to;
    private JProgressBar  pbar;
    public CopyThread(String from, String to, JProgressBar pbar) {
        this.from = from;
        this.to = to;
        this.pbar = pbar;
    }
    public void run() {
        pbar.setMaximum((int)(new File(from)).length());
        pbar.setValue(0);
        pbar.setStringPainted(true);
        try {
            InputStream is = new FileInputStream(from);
            OutputStream os = new FileOutputStream(to);
            int total = 0;
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
                os.write(b, 0, n);
                total += n;
                pbar.setValue(total);
            }
            is.close();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 21:44 #11
Jeg er efterhånden rimeligt nedkørt...

Jeg kan godt få dit program til at virke, men hvis jeg prøver at lave det om til en JApplet, går det galt...

Jeg har så prøvet at tilrette mit program men det går også galt.

Jeg har lidt svært at finde ud af hvor det lige er det går glat da java stadig kun er ca. 2 døgn gammelt for mig.

Men her er hele koden så håber jeg en gider hjælpe mig videre...(og den virker mangler bare progressbar og Thread)

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;
import java.net.*;
import org.apache.commons.net.ftp.FTPClient;

public class UploadManager extends JApplet implements ActionListener {
    private String dirname;
    private String filename;

    private JLabel Label;

    Button SelectButton;
    public JFileChooser fileChooser; // file chooser

    public UploadManager() {
        setLayout(new FlowLayout());

        Label = new JLabel("Text-Only Label");
        Label.setText("Test");
       
        SelectButton = new Button("Upload File3");
       
        add(SelectButton);
        add(Label);
       
        SelectButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent evt) {

        if (evt.getSource() == SelectButton) {
            FileSelect();
        }
    }
       
      public void FileSelect() {
        try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
              e.printStackTrace();
        }

        Label.setText("Vælg fil");

          UIManager.put("FileChooser.openButtonText", "Åbn");
        UIManager.put("FileChooser.cancelButtonText", "Luk");

        JFileChooser fileChooser = new JFileChooser("");
//        fileChooser.setAcceptAllFileFilterUsed(false);

/*
          MyFilter filter = new MyFilter();
        filter.addExtension("pdf");
        filter.addExtension("esp");
        filter.addExtension("ai");
        filter.addExtension("cdr");
        filter.addExtension("cpt");
        filter.addExtension("jpg");
        filter.addExtension("tif");
        filter.addExtension("gif");
        fileChooser.setFileFilter(filter);
*/
    int returnValue = fileChooser.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            File dir = fileChooser.getCurrentDirectory();
            dirname = dir.getAbsolutePath();
            File selectedFile = fileChooser.getSelectedFile();
            filename = selectedFile.getName();
            upload(dirname, filename);
        }
    }

    public void upload(String dirname, String filename) {
        FTPClient client = new FTPClient();
        try {
            client.connect("adresse");
            client.login("username", "password");
            InputStream is = new FileInputStream(dirname + File.separator + filename);
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            OutputStream os = client.storeFileStream("z.jpg");

            byte buf[] = new byte[8192];
            int bytesRead = is.read(buf);
            while (bytesRead != -1) {
                os.write(buf, 0, bytesRead);
                bytesRead = is.read(buf);
            }

            os.close();
            is.close();
            client.disconnect();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
Avatar billede _carsten Nybegynder
12. maj 2008 - 22:21 #12
Gætter på at Arne tidligst vender tilbage i morgen (han skriver æ,ø,å som ae,oe,aa), så han er nok et sted verden hvor æøå ikke findes på tastaturet.

Men - du mangler i hvert fald en init() metode i din applet.

Læg følgende metode ind

public void init(){  // Den initierer din applet
        try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
              e.printStackTrace();
        }


        UIManager.put("FileChooser.openButtonText", "Åbn");
        UIManager.put("FileChooser.cancelButtonText", "Luk");
       
        new UploadManager();
}

Jeg lukker også for i dag.
Avatar billede nybegynder_java Nybegynder
12. maj 2008 - 23:25 #13
Jeg er lidt videre...

min applet virker. (næsten)

Jeg har udvidet lidt på den så den ser sådan ud:

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;
import java.net.*;
import org.apache.commons.net.ftp.FTPClient;

public class UploadManager extends JApplet implements ActionListener {
    private String dirname;
    private String filename;
    public static JProgressBar pbar;
    private static JLabel Label;

    JButton SelectButton;
    JButton UploadButton;
    JButton CancelButton;
   
    public JFileChooser fileChooser; // file chooser

    public UploadManager() {
    }

    public void init() {
        try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
              e.printStackTrace();
        }
        UIManager.put("FileChooser.openButtonText", "Åbn");
        UIManager.put("FileChooser.cancelButtonText", "Luk");

        setLayout(new FlowLayout());

        Label = new JLabel("Text-Only Label");
        Label.setText("Test");
       
        SelectButton = new JButton("Browse");
        UploadButton = new JButton("Upload");
        CancelButton = new JButton("Cancel Upload");
       
        pbar = new JProgressBar();
       
        add(SelectButton);
        add(UploadButton);
        add(CancelButton);
        add(Label);
        add(pbar, BorderLayout.CENTER);
       
        SelectButton.addActionListener(this);
          UploadButton.addActionListener(this);
          CancelButton.addActionListener(this);

        UploadButton.setEnabled(false);
        CancelButton.setEnabled(false);
    }

    public void actionPerformed(ActionEvent evt) {
        UploadThread upldThread = new UploadThread(dirname, filename, UploadManager.Label, UploadManager.pbar);

        if (evt.getSource() == SelectButton) {
            FileSelect();
                if(dirname != "" && dirname != "\null") {
                    Label.setText(dirname + File.separator + filename);
                    UploadButton.setEnabled(true);
                }
               
        }
        if (evt.getSource() == UploadButton) {
            SelectButton.setEnabled(false);
            CancelButton.setEnabled(true);
            upldThread.start();
        }
        if (evt.getSource() == CancelButton) {
            SelectButton.setEnabled(true);
            CancelButton.setEnabled(false);
            upldThread.stop();
        }
    }
       
      public void FileSelect() {

        JFileChooser fileChooser = new JFileChooser("");

        Label.setText("Vælg fil");

//        fileChooser.setAcceptAllFileFilterUsed(false);

          MyFilter filter = new MyFilter();
        filter.addExtension("pdf");
        filter.addExtension("esp");
        filter.addExtension("ai");
        filter.addExtension("cdr");
        filter.addExtension("cpt");
        filter.addExtension("jpg");
        filter.addExtension("tif");
        filter.addExtension("gif");
        fileChooser.setFileFilter(filter);

        int returnValue = fileChooser.showOpenDialog(null);
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            File dir = fileChooser.getCurrentDirectory();
            dirname = dir.getAbsolutePath();
            File selectedFile = fileChooser.getSelectedFile();
            filename = selectedFile.getName();
//            UploadThread upldThread = new UploadThread(dirname, filename, UploadManager.Label, UploadManager.pbar);
//            upldThread.start();

        }
    }

    public static void main(String[] args) {
        UploadManager um = new UploadManager();
        um.setVisible(true);
    }
}

class UploadThread extends Thread {
    private String dirname;
    private String filename;
    private JLabel Label;
    private JProgressBar pbar;
    public UploadThread(String dirname, String filename, JLabel Label, JProgressBar pbar) {
        this.dirname = dirname;
        this.filename = filename;
        this.Label = Label;
        this.pbar = pbar;
          Label.setText("Thread");

    }
    public void run() {
        pbar.setMaximum((int)(new File(dirname + File.separator + filename)).length());
        pbar.setValue(0);
        pbar.setStringPainted(true);
        FTPClient client = new FTPClient();
        try {
            client.connect("1234");
            client.login("1234", "1234");
            InputStream is = new FileInputStream(dirname + File.separator + filename);
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            OutputStream os = client.storeFileStream("z.jpg");
            int total = 0;
            byte buf[] = new byte[8192];
            int bytesRead = is.read(buf);

            while (bytesRead != -1) {
                os.write(buf, 0, bytesRead);
                bytesRead = is.read(buf);
                pbar.setValue(total);
            }

            os.close();
            is.close();
            client.disconnect();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

1. progressbar tæller ikke op kommer på 0 når UploadTread startes

2. Jeg kan ikke stoppe UploadTread igen, med knappen "Cancel Upload"

3. if(dirname != "" && dirname != "\null") virker ikke hvad skriver jeg lige der...

4. Ja og så er der lige formateringen, af knapper de andre ting men det kan jeg vil rode med når det andet er på plads.
Avatar billede arne_v Ekspert
12. maj 2008 - 23:36 #14
Jeg er skam her. Jeg er 6 timer bagefter Danmark, så klokken er ikke så mange endnu.

Min arbejds PC har US tastatur, men min egen PC har DK tastatur, så ÆØÅ afhænger lidt af
tidspunktet på dagen.

re 1)

skal jeg vist lige kigge lidt på

re 2)

prøv:

upldThread.stop();

->

upldThread.interrupt();

re 3)

prøv:

if(dirname != "" && dirname != "\null")

->

if(dirname != null && !dirname.equals(""))
Avatar billede arne_v Ekspert
12. maj 2008 - 23:37 #15
med hensyn til #3, så er det vigtigt at vide at i Java betyder:

a == b, at a og b refererer samme objekt

a.equals(b), at a og b har samme værdi
Avatar billede nybegynder_java Nybegynder
13. maj 2008 - 17:21 #16
sv 2)
hvis du mener jeg skal erstatte upldThread.stop(); med upldThread.interrupt(); så virker det ikke.

sv 3) Det virker. og tak for forklaringen.
Avatar billede nybegynder_java Nybegynder
13. maj 2008 - 23:39 #17
re 1) ups...

total += n;
Avatar billede nybegynder_java Nybegynder
13. maj 2008 - 23:54 #18
re 4) så er kustering af kanpper også på plads.

Jeg har et par spørgsmål til men må heller oprette et nyt spørgsmål for disse...

Arne gider du svare
Avatar billede arne_v Ekspert
14. maj 2008 - 04:04 #19
svar
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

IT-JOB