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.....
Annonceindlæg fra Computerworld it-jobbank
Mød 3.500+ it-talenter på IT-DAY 2026
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
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...
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(); } }
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...
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)..
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..
..og "p" er "procent".. :-)
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...
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.
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(); } } }
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(); } } }
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.
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.
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(""))
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
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.
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
Kurser inden for grundlæggende programmering