Vor kurzem muss das Projekt eine Datei hochgeladen werden. Teilen Sie sie nach Abschluss der Arbeiten und machen Sie sich auch Notizen.
Die Upload-Funktion ist im Hintergrund und im Java implementiert, und das Front-End wird hauptsächlich in JS AJAX implementiert. Der Hintergrund fügt auch temporäre Dateien hinzu, die regelmäßig gelöscht werden sollen.
Der Effekt ist wie im Bild gezeigt
Erstens ist die Hauptklasse der Upload -Funktion der folgende Code
Paket util.Upload; import java.io.file; import java.io.ioxception; import Java.text.SimpledateFormat; import Java.util.date; import Java.util.iterator; Import Java.util.List; javax.servlet.http.httpServlet; import javax.servlet.http.httpletRequest; import javax.servlet.http.httpserservletresponse; importieren javax.servlet.http.httpSession; org.apache.commons.FileUpload.disk.diskFileItemFactory; import org.apache.commons.FileUpload.Servlet.ServletFileUpload; UploadServlet erweitert httpServlet {private statische endgültige long serialversionuid = -310002842842232371321131321131359l; privat boolesche ist erfolgt; private Zeichenfolge nach oben; // Array mit rechtlicher Suffix -Name private String definieren [] erlaubtextname = new String [] {"Zip", "rar", // Kompressdatei "txt", "doc", "wps", "docx", "java", // text "xls", "xlsx", // table "ppt", "pptx", // dia "pdf", // spiele "f" jpg "," bmp "," gif ", png" // // bild}; HttpServletResponse-Antwort) löst ServletException aus, IOException {Dopost (Request, Antwort); Response.Setcharacterencoding ("UTF-8"); // Einen Maximalwert für die hochgeladene Datei festlegen, die nicht über 100 MB MAXSIZE = 100*1024*1024 überschreiten darf; ServletFileUpload upload = new ServletFileUpload (fabrik); // Erstellen Sie den Upload -Listener und setzen Sie den Listener UploadListener Listener = new uploadListener (); Session.SetAttribute ("Hörer", Hörer); Upload.SetProgressListener (Listener); // PATH STRING STRING PATH = Request.GetSession (). GetServletContext (). GetRealPath ("/Upload"); String RequestPath = Request.GetSession (). GetServletContext (). GetContextPath ()+"/Upload"; Datei Dirfile = New Datei (Path); //System.out.println(Request.GetSession (). GetServletContext (). GetContextPath ()); // Wenn der Ordner nicht existiert, erstellen Sie if (! Dirfile .exists () &&! Dirfile .isDirectory ()) {Dirfile .mkdir (); } // Erstellen Sie einen Ordner basierend auf dem Datum und speichern Sie ihn im Ordner mit dem entsprechenden Datum Datum datum = neuer Datum (); SimpleDateFormat SDF = new SimpledateFormat ("yyyymmdd"); String subdirname = sdf.format (Datum); Datei subdirFile = neue Datei (Pfad+"/"+Subdirrname); if (! subdirfile .exists () &&! subdirfile .isDirectory ()) {subdirfile .mkdir (); } try {// upload upload -Anforderungsliste <DileItem> items = upload.ParSerequest (Anfrage); Iterator <DileItem> itr = items.Iterator (); while (itr.hasnext ()) {FileItem item = (FileItem) itr.next (); // Bestimmen Sie, ob es sich um eine Dateidomäne handelt, wenn (! Isformfield ()) {if (item.getName ()! String Dateiname = item.getName (); // den Datei -Suffix -Namen String [] sceilname = Dateiname.split ("//.") Abrufen; String extname = Splitname [Splitname.Length-1]; // Überprüfen Sie den Datei -Suffix -Namen für (String erlaubt: erlaubtextname) {if (erlaubt.equalSignoreCase (Extname)) {isallowed = true; }} if (! isallowed) {error = "Das Upload -Dateiformat ist illegal!"; brechen; } if (upFileSize> maxSize) {error = "Die Datei, die Sie hochladen, ist zu groß. Bitte wählen Sie eine Datei aus, die 100 MB nicht überschreitet!"; brechen; } // zu diesem Zeitpunkt wird die Datei vorübergehend im Speicher des Servers gespeichert, wobei eine temporäre Objektdatei tempfile = neue Datei (makeFileName (Dateiname)) erstellt wird. // Geben Sie den Verzeichnis und den Dateinamen der Datei -Upload -Serverdatei = neue Datei an (Path+"/"+Subdirname+"/", tempfile.getName ()); item.write (Datei); // Die erste Methode zum Schreiben von Dateien ist upFileName = RequestPath+"/"+Subdirname+"/"+tempfile.getName (); if (upFileName.equals ("")) {error = "Keine Auswahl zum Hochladen von Dateien!"; } System.out.println (UpFileName); /*// Erstellen Sie die zweite Methode zum Schreiben von Datei mit Eingabestream -Lesung Datei inputStream is = item.getInputStream (); int länge = 0; Byte [] von = New Byte [1024]; FileOutputStream fos = new FileOutputStream (Datei); while ((länge = is.read (by))! =-1) {fos.write (by, 0, länge); //Thread.sleep(10); } fos.close (); //Thread.sleep(1000); */} else {error = "Keine Auswahl zum Hochladen von Datei!"; }}}} catch (Ausnahme e) {e.printstacktrace (); error = "Fehler beim Hochladen der Datei:"+e.getMessage (); } if (! error.equals ("")) {System.out.println (error); Session.SetAttribute ("Fehler", Fehler); } else {session.setAttribute ("Ergebnis", "OK"); Session.SetAttribute ("Dateiname", UpFileName); }} / *** Um das Überschreiben von Dateien zu verhindern, muss ein eindeutiger Dateiname generiert werden, um die Datei hochzuladen }} Es ist notwendig, Commons-fileUpload-1.3.1.jar und Commons-io-2.4.jar einzuführen
Während des Upload -Prozesses müssen wir Informationen wie Upload -Fortschritte in Echtzeit erhalten. Die eingeführte Bibliothek fügte uns eine Progresslistener -Schnittstelle hinzu. Wir werden eine andere Klasse schreiben, um diese Schnittstelle zu implementieren und diese Schnittstelle zur obigen Klasse hinzuzufügen.
// Factory -Objekte erstellen und Dateien hochladen Objekte diskFileItemFactory factory = new diskFileItemfactory (); ServletFileUpload upload = new ServletFileUpload (fabrik); // Erstellen Sie den Upload -Listener und setzen Sie den Listener UploadListener Listener = new uploadListener (); Session.SetAttribute ("Hörer", Hörer); Upload.SetProgressListener (Listener);Im Folgenden finden Sie den spezifischen Implementierungscode dieser Hörklasse
Paket util.Upload; org.apache.commons.FileUpload.ProgressListener; öffentliche Klasse UploadListener implementiert ProgressListener {private volatile long bytead = 0l, // Anzahl hochgeladener Bytes contentLength = 0l, // Gesamtzahl der Bytes item = 0l; public uploadListener () {super (); } @Override public void Update (langes AbytesRead, Long AcontentLength, int Anitem) {byteSread = AbytesRead; contentLength = acontentLength; item = anitem; } public long getbytesread () {return bytesread; } public Long getContentLength () {return contentLength; } public long getItem () {return item; }}Jetzt können Sie Informationen wie Upload -Fortschritte erhalten, aber Sie benötigen immer noch einen Servlet, um zum Frontend zurückzukehren. Die folgende Implementierung
Paket util.Upload; import Java.io.ioException; import Java.io.printwriter; import Java.util.hashMap; import Java.util.map Javax.Servlet.ServletException; import. javax.servlet.http.httpServletResponse; import Javax.servlet.http.httpSession; import org.apache.commons.FileUpload.ProgressListener; HttpServlet {private statische endgültige long serialversionuid = -3596466520775012991l; Protected void dodget (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, ioException {Dopost (Request, Antwort); } Protected void dopost (httpServletRequest-Anforderung, httpServletResponse-Antwort) löst ServletException aus, ioException {request.setcharactercoding ("utf-8"); response.setcharactercoding ("utf-8"); UploadListener -Listener = null; HttpSession Session = Request.GetSession (); String error = (String) session.getAttribute ("error"); String result = (String) session.getAttribute ("Ergebnis"); String Dateiname = (String) session.getAtTribute ("Dateiname"); Printwriter out = response.getWriter (); Long ByteSread = 0, contentLength = 0; if (session! if (louser == null) {return; } else {byteSread = listener.getByTesRead (); // Die Anzahl der hochgeladenen Bytes contentLength = Listener. //System.out.println(rp); out.print (RP); /* // JSON -Formatdatenkarte <String, Objekt> map = new HashMap <String, Object> () zurückgeben; map.put ("byteSread", byteSread); map.put ("contentLength", contentLength); map.put ("error", error); map.put ("Ergebnis", Ergebnis); map.put ("Dateiname", Dateiname); Gson gson = new gson (); String json = gson.tojson (MAP); out.print (json);*/ out.flush (); out.close (); }}}Der im Hintergrund hochgeladene Funktionscode wurde geschrieben. Das Folgende ist das Front-End zum Implementieren des Uploads, zunächst HTML
<! DocType html> <html> <head> <meta charset = "utf-8"/> <script type = "text/javaScript" src = "js/upFile.js" charset = "utf-8"> </script> <link rel = "stylesheet" type = "text/cs > <a href = "javaScript: addone ()"> add </a> <div id = "target"> <input type = "file" id = "Datei" name = "Datei" aufchange = "addFile (Ereignis)" multiple/> </div> <span id = "test"> 0 </span> </body> </html>> </html>> </div> <span id = "> 0 </span> </body> </html>
Die Schnittstelle ist relativ einfach, fügen Sie einfach ein Tag hinzu und die hochgeladene Eingabe ist versteckt.
Anzeige des Upload -Fortschritts von CSS -Datei -Hauptrendering
#file {display: keine; } .pro {width: 500px; } .pborder {Position: relativ; Breite: 500px; /* Breite*/ Grenze: 1px fest #B1D632; Polsterung: 1PX; } .drawpro {width: 0px; Anzeige: Block; Position: Relativ; Hintergrund: #B1D632; Farbe: #333333; Höhe: 20px; /* Höhe*/ Linienhöhe: 20px; /* Es muss mit der Höhe übereinstimmen, bevor der Text vertikal zentriert werden kann*/} .pspan {Position: absolut; Breite: 500px; Text-Align: Mitte; Schriftgewicht: fett; }Als nächstes kommt der Front-End Focus, JS-Datei
//The htmlvar upfile_html that displays upload information is '<div><div>' + '<span>0%</span></div></div><span name="path"></span><img src="common/upload/images/del.png" style="float:right" name="del" onclick=abortUpload(this)>';var targetDIV_id = "Ziel"; // Die IDVAR des Zieldivs zum Hochladen der Datei httpxml = null; // Das XMLHTTTPREquest -Objekt, das die Upload -Anforderung Var httpprogress = null; // xmlhttprequest -Objekt sendet, die die Anfrage -Fortschritt -Information -VAR -VAR -ATTILISTE -VAR -ATTILIST -VAR -SAVE -INFILISTE -VAR -SAVE -INFILISTE -VARALIST sendet. Array (); // Speichern Sie die Liste der hochgeladenen Dateien var f_input; // Das Eingabefiel hochladen, das die Datei var flag = true; // kann das nächste Dateiflag var Uurl = "Upload"; // Anfrage zum Hochladen der Datei urlvar gurl = "GetProgress"; // Aufladung der Datei nunlvar // // Timent timlvar // // Timer // // // TIRTORLAGE // // // TIRTORLAGE // // // TIRTORLADE // // // TIRGORDE // // // TIRGORTOLGELADEN: 0; // idvar id der Datei, die hochgeladen wurde = 0; // ID der letzten Datei in der Warteschlange/*** Dateiobjekt*/Funktion UploadFile (ID, Datei) {this.id = id; this.file = Datei; this.state = 0; this.path = "";}/*** Initialisierungsmethode*/window.onload = function init () {f_input = document.getElementById ("Datei"); var tdiv = document.getElementById (targetDiv_id); var oldspan = tdiv.getElementsByTagName ("span"); für (var i = 0; i <oldspan.length; i ++) {oldFilelist.push (OldSpan [i] .GetAttribute ("Name")); }}/** * Wählen Sie eine Datei zum Hochladen */Funktion addone () {f_input.value = null; f_input.click ();}/*** Nach Auswahl der Datei das Dateiobjekt zur Warteschlange hinzufügen und das Hochladen von**/Funktion adddatfile (evt) {var f = f_input.files [0]; if (f! = undefiniert) {var uf = new UploadFile (id, f); upplist.push (UF); var div = document.createelement ("div"); Div.SetatTribute ("ID", "Pro" + (ID)); Div.SetAttribute ("Klasse", "Pro"); div.innerHtml = upFile_html; var targetDiv = document.getElementById (targetDiv_id); targetDiv.appendchild (div); Div.GetElementsByTagName ("span") [1] .Innerhtml = "Dateiname:" + uplist [id] .file.name; waitTimer = setInterval ("upload ()", 1000); Id ++; }}/*** Laden Sie die Datei in die Warteschlange hoch*/function upload () {if (flag == true) {if (upplist.length> 0) {var uf; für (var i = 0; i <upplist.length; i ++) {if (upplist [i] .state == 0) {uf = upplist [i]; Uplist [i] .State = 1; brechen; }} if (uf! = undefined & uf! = null) {flag = false; if (window.xmlhttprequest) {httpup = new XmlHttpRequest (); } else if (window.activeXObject) {httpup = new ActiveXObject ("microsoft.xmlhttp"); } var formData = new formData (); FormData.Append ("Datei", uf.file); httpup.open ("post", uurl, true); httpup.Upload.AdDeVentListener ('Progress', UploadProgress, False); httpup.send (FormData); nowid = uf.id; Timer = setInterval ("getP ()", 50); }}}}/*** Informationen wie Hochladen Fortschritt*/function getP () {if (window.xmlhttpRequest) {httpprogress = new xmlhttpRequest (); } else if (window.activeXObject) {httpprogress = new ActiveXObject ("microsoft.xmlhttp"); } httpprogress.onReadyStatechange = onProgress; httpprogress.open ("post", gurl, true); httpprogress.setRequestHeader ("Content-Typ", "Anwendung/x-www-form-urlencoded"); httpprogress.send ("& timestamp =" + (New Date ()). var result = result.replace (/(^/s*) | (/s*$)/g, ""); var res = result.split (","); var jetzt = parseInt (res [0]); var All = ParseInt (res [1]); var err = res [2]; var state = res [3]; var path = res [4]; var per = (jetzt / alle * 100) .Tofixed (2); var prodiv = document.getElementById ("pro" + nowid); if (prodiv! = null & prodiv! = undefined) {if (err! = "" & err! if (cancelflag == 1) {err = "terlad terminierung hochladen"; cancelflag = 0; } prodiv.getElementsByTagName ("div") [0] .Style.display = "Keine"; prodiv.getElementsByTagName ("span") [1] .innerhtml = Err; httpup.abort (); Flag = wahr; UpList [nowid] .State = 3; zurückkehren; } if (state == "ok") {prodiv.getElementsByTagName ("div") [0] .Style.display = "None"; var tmpf = upplist [nowid] .file; prodiv.getElementsByTagName ("span") [1] .innerhtml = "Dateiname:" + tmpf.name; Fenster.ClearInterval (Timer); Flag = wahr; UpList [nowid] .State = 2; Uplist [nowid] .Path = Pfad; zurückkehren; } prodiv.getElementsByTagName ("div") [1] .Style.width = per * 5 + "px"; prodiv.getElementsByTagName ("span") [0] .innerhtml = pro + "%"; }}}/*** Methode zum Abbrechen des Uploads*/Funktion abortUpload (obj) {var idstr = obj.parentnode.id; var id = idstr.lice (3); if (upplist [id] .state == 1) {httpup.abort (); Flag = wahr; Cancelflag = 1; } else {upplist [id] .state = 3; } document.getElementById (idstr) .remove ();}/*** Rufen Sie den Pfad zum Upload -Datei ab* @returns formatted String*/function getFilelistStr () {var str = ""; if (oldFilelist.length> 0) {für (var i = 0; i <oldFilelist.length; i ++) {if (Oldfilelist [i]! = Null & Oldfilelist [i]! }}} für (var i = 0; i <uplist.length; i ++) {var f = upplist [i]; if (f.State == 2) {str = str + f.path + ","; }} return str;}/*** Entfernen Sie den alten Anhang, der bereits vorhanden war, wenn die Änderung**/Funktion REDNODD (BTN) {var num = btn.getAttribute ("Name"); Oldfilelist [num - 1] = null; btn.parentnode.remove ();} Funktion uploadProgress (e) {if (e.LengthComputable) {var iByTesUploaded = e.Loaded; var iByTestotal = e.total; document.getElementById ("test"). Innerhtml = iByTesuploaded+"/"+iByTestotal; }} Verwenden Sie AJAX, um Upload -Dateien zu senden, um Fortschritte, Ergebnisse und andere Informationen hochzuladen.
Die verwendete HTML5 -Datei -API ist so, dass IE9 oder höher kompatibel sein muss. Firefox hat ein Problem. Ajax -Anfragen kehren nicht sofort zurück. Das gleiche Ergebnis wird zurückgegeben, bis alle AJAX -Anfragen gesendet werden, was dazu führt, dass der Upload -Fortschritt nicht angezeigt wird. Sie können jedoch auch die HTML5 -Datei -API verwenden, um sie zu erhalten, die einen kleinen Code hinzugefügt hat. Der Wert in der Testdiv unter der Seite ist der Fortschritt am vorderen Ende.
Alle hochgeladenen Dateien wurden implementiert, und dann werden die hochgeladenen temporären Dateien verarbeitet. Da die mit UUID benannten Dateien verwendet werden, werden viele Dateien generiert und die nutzlosen müssen regelmäßig verarbeitet werden. Verwenden von ServletContextListener:
In der Servlet -API befindet sich eine ServletContextListener -Schnittstelle, die auf den Lebenszyklus des ServletContext -Objekts zuhören kann, das eigentlich der Lebenszyklus der Webanwendung ist.
Wenn der Servlet -Container eine Webanwendung startet oder beendet, wird das ServletContexevent -Ereignis ausgelöst, das vom ServletContextListener behandelt wird. Zwei Methoden sind in der ServletContextListener -Schnittstelle definiert, um das ServletContexevent -Ereignis zu verarbeiten.
Mit seinen Funktionen wird die Funktion des regelmäßigen Löschens temporärer Dateien realisiert. Der Code ist wie folgt:
Paket util.Upload; import Java.io.ioException; import Java.io.inputStream; Import Java.util.date; import Java.util.properties; import Java.util.timer; importieren java.util.timertask; import. javax.servlet.servletContextListener;/ ** * Zeithörer * * */ public class tempfilelistener implementiert servletContextListener {private timer timer; private SystemTaskest SystemTask; private statische Zeichenfolge EINFACH_TIME_RUN; static {Properties prop = neue Eigenschaften (); InputStream Instrem = tempfilemanager.class.getClassloader () .GetResourceAsStream ("tempfile.Properties"); try {prop.load (Instrem); System.out.println (Instrem); Every_time_run = prop.getProperty ("Every_time_run"); } catch (ioException e) {e.printstacktrace (); } endlich {try {instrem.close (); } catch (ioException e) {e.printstacktrace (); }}} // Listener Initial method public void contextInitialized (servletContexevent scce) {Timer = new Timer (); SystemTask = new SystemTaskest (sce.getServletContext () .getRealPath ("/"), SCE.GetServletContext ()); try {System.out.println ("Timer gestartet"); // Der Hörer erhält das Root -Verzeichnis der Website String path = scce.getServletContext (). GetRealPath ("/"); Langzeit = long.parselong (time_time_run) * 1000; // Die Zeit für das Schleifenausführungssystem.out.println ("Zeit" + Zeit); // Der erste Parameter ist der Code, der ausgeführt wird, der zweite Parameter ist, wenn er ausgeführt wird, und der dritte Parameter ist, wie oft er ausgeführt wird. Wiederholung der Ausführung von Timer.Schedule (SystemTask, 10000, Zeit); System.out.println ("Aufgabenplan wurde hinzugefügt"); } catch (Ausnahme e) {e.printstacktrace (); }} public void contextDestroyed (servletContexevent scaling) {try {timer.cancel (); } catch (Ausnahme E) {}}} / *** Tasker** / class SystemTaskest Extends timertask {private servletContext context; privater Stringweg; public SystemTaskest (String -Pfad, ServletContext -Kontext) {this.path = path; this.context = context; } / *** geben die Aufgabe ein, die regelmäßig in run* / public void run () {tempfilemanager etf; try {system.out.println ("die Aufgabe starten!"); // Code, der ausgeführt wird, system.out.println (neues Datum (). Tolocalestring ()); ETF = NEU TEMPFILEMANGE (Pfad); etf.run (); System.out.println ("Geben Sie die Aufgabenausführung an!"); } catch (Ausnahme e) {e.printstacktrace (); }}}Das obige ist nur ein Hörer, der dafür verantwortlich ist, die Methode zum regelmäßigen Löschen von temporären Dateien aufzurufen. Die spezifische Implementierung ist die folgende Klasse
Paket util.Upload; import java.io.file; import Java.io.ioxception; import Java.io.inputStream; Importieren Sie Java.util.date; Java.util.Properties;/*** Löschen Sie die Datei auf dem Server*/Public Class tempFilemanagers. Zeit für die Dateispeicherung ist ein Tag static {Properties prop = new Properties (); InputStream Instrem = tempfilemanager.class.getClassloader () .getResourceAsStream ("execl.properties"); try {prop.load (Instrem); Retention_time = prop.getProperty ("file_retention_time"); } catch (ioException e) {e.printstacktrace (); } endlich {try {instrem.close (); } catch (ioException e) {e.printstacktrace (); }}} /*** Konstruktor. Initialisierungsparameter * @param Pfad */ public tempFilemanager (String -Pfad) {this.path = path; } / *** Setzen Sie den Code ein, den der Thread in run ()* / public void run () {System.out.println ("Dateiverwaltung start =========================================================================================================== FADE. DeleteFiles (Datei); if (candeletefile (order)) {if (order.delete ()) {System.out.println ("Ordner" + Ordner.getName () + "erfolgreich löschen!"); (int i = 0; i <files.length; i ++) {if (Dateien [i] .isDirectory ()) {deleteFiles (Dateien [i]); Dateien löschen, die die Kriterien erfüllen, wenn (candeleteFile (file)) {if (file.delete ()) {System.out.println ("Datei" + file.getName () + "erfolgreich löschen!"); } else {System.out.println ("Datei" + file.getName () + "Delete fehlgeschlagen! Diese Datei wird möglicherweise verwendet"); }} else {}} else {system.out.println ("Keine Datei zu löschen"); }} catch (Ausnahme e) {System.out.println ("Datei delete failed ============"); E. printstacktrace (); }} / *** Bestimmen Sie, ob die Datei gelöscht werden kann Datum Datum = neuer Datum (); Long Time = (Datum.GetTime () - FileDate.getTime ()) / 1000 /60 - Integer.ParseInt (retention_time); // Die Minuten zwischen der aktuellen Zeit und dem Dateiintervall // system.out.println ("time =="+time); if (time> 0) {return true; } else {return false; }} / ** * die letzte Änderungszeit der Datei erhalten * * @param Datei * @return * / private Datum getFileDate (Dateidatei) {Long ModifiedTime = Datei.LastModified (); Datum d = neues Datum (ModifiedTime); Rückkehr D; }}Bestimmen Sie, ob die Datei abgelaufen ist und der Ordner automatisch gelöscht werden kann, wenn sie zeitlich festgelegt ist.
Das obige dreht sich alles um diesen Artikel. Ich hoffe, dass es für alle hilfreich sein wird, Java -Programme zu lernen.