Baru -baru ini, proyek perlu diunggah file. Setelah menyelesaikan pekerjaan, bagikan dan buat catatan juga.
Fungsi unggahan diimplementasikan di latar belakang dan Java, dan front-end terutama diimplementasikan di AJAX JS. Latar belakang juga menambahkan file sementara untuk dihapus secara teratur.
Efeknya seperti yang ditunjukkan pada gambar
Pertama -tama, kelas utama fungsi unggahan, berikut ini adalah kode
paket util.upload; impor java.io.file; impor java.io.ioexception; impor java.text.simpledateFormat; impor java.util.date; impor java.util.iterator; impor java.util.list; impor java.util.uuid; impor javax. javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; impor; org.apache.commons.fileupload.disk.diskFileItemFactory; impor org.apache.commons.fileupload.servlet.servletfileUpload; kelas publik unggah servlet meluas httpservlet {private static long serialversionuid = -3100028 Boolean pribadi terkandung; Private String UpfileName; // Tentukan array dengan nama sufiks legal string pribadi [] diizinkanName = string baru [] {"zip", "rar", // compress file "txt", "doc", "wps", "docx", "java", // text "xls", "xlsx", // table "ppt", "pptx", // slide "Pdf", // mainkan "f" jpg "," bmp "," gif "," png ", pucat" jpg "," bmp "," gif "," png "/picture}} pucat (bmp HttpservletResponse response) melempar servletException, ioException {dopost (permintaan, respons); response.setCharacterEncoding("utf-8"); //Get session, save progress and upload results, upload starts as nok, when Ok means uploading is completed HttpSession session=request.getSession(); session.setAttribute("result", "nok"); session.setAttribute("error", ""); String error=""; upFileName=""; isAllowed=false; //Set a Nilai maksimum untuk file yang diunggah, yang tidak boleh melebihi 100MB int MaxSize = 100*1024*1024; SERVLETFILEUPLOAD UEDLOAD = SERVLETFILEUPLOAD baru (pabrik); // Buat unggahan pendengar dan atur pendengar unggahan listener = new unggahlistener (); session.setAttribute ("pendengar", pendengar); unggah.setProgressListener (pendengar); // unggah path string path = request.getSession (). Getservercontext (). GetRealPath ("/unggah"); String requestPath = request.getSession (). GetserVletContext (). GetContextPath ()+"/unggah"; File dirfile = file baru (path); //System.out.println(Request.getSession (). GetServletContext (). GetContextPath ()); // Jika folder tidak ada, buat if (! Dirfile .exists () &&! Dirfile .isdirectory ()) {dirfile .mkdir (); } // Buat folder berdasarkan tanggal dan simpan ke folder dengan tanggal tanggal yang sesuai = tanggal baru (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyymmdd"); String subdirname = sdf.format (tanggal); File subdirfile = file baru (path+"/"+subdirname); if (! Subdirfile .exists () &&! Subdirfile .isdirectory ()) {subdirfile .mkdir (); } coba {// Parse Daftar Permintaan Upload <FILEITEM> item = unggah.ParSequest (permintaan); Iterator <FILEItEM> ITR = items.iterator (); while (itr.hasnext ()) {fileItem item = (fileItem) itr.next (); // Tentukan apakah itu domain file if (! Item.isformField ()) {if (item.getName ()! = Null &&! Item.getName (). Equals ("")) {// Dapatkan ukuran file yang diunggah dan nama file Long UpFilesize = item.getSize (); String filename = item.getName (); // Dapatkan file suffix name string [] splitName = filename.split ("//."); String extName = splitName [splitName.length-1]; // periksa nama file sufiks untuk (string diizinkan: diizinkan extage) {if (diizinkan.equalsignorecase (extName)) {iSallowed = true; }} if (! isallowed) {error = "Format file unggah adalah ilegal!"; merusak; } if (upfileSize> maxSize) {error = "File yang Anda unggah terlalu besar, silakan pilih file yang tidak melebihi 100MB!"; merusak; } // Saat ini file disimpan sementara di memori server, membangun file objek sementara tempfile = file baru (makefileName (fileName)); // Tentukan nama direktori dan file file server unggahan file = file baru (path+"/"+subdirname+"/", tempfile.getname ()); item.write (file); // Metode pertama file penulisan adalah upFileName = requestPath+"/"+subdirname+"/"+tempfile.getName (); if (upfileName.equals ("")) {error = "Tidak ada pilihan untuk mengunggah file!"; } System.out.println (UpFileName); /*// Bangun metode kedua file penulisan input are bacaan inputStream adalah = item.getInputStream (); panjang int = 0; byte [] oleh = byte baru [1024]; FileOutputStream fos = baru fileOutputStream (file); while ((length = is.read (by))! =-1) {fos.write (oleh, 0, panjang); //Thread.sleep(10); } fos.close (); //Thread.sleep(1000); */} else {error = "Tidak ada pilihan untuk mengunggah file!"; }}}} catch (Exception e) {E.PrintStackTrace (); error = "Terjadi kesalahan saat mengunggah file:"+e.getMessage (); } if (! error.equals ("")) {System.out.println (error); session.setAttribute ("error", error); } else {session.setAttribute ("hasil", "ok"); session.setAttribute ("nama file", upfileName); }} / *** Untuk mencegah impliting file, nama file yang unik harus dihasilkan untuk mengunggah file* @param fileName nama file asli* @Return Nama file unik yang dihasilkan* / Private String makeFileName (string filename) {return uuid.randomuid (). ToString () + " + file uuid.randomuid (). }} Penting untuk memperkenalkan commons-fileupload-1.3.1.jar dan commons-io-2.4.jar
Selama proses unggahan, kita perlu mendapatkan informasi seperti mengunggah kemajuan secara real time. Perpustakaan yang diperkenalkan menambahkan antarmuka ProgressListener untuk kami. Kami akan menulis kelas lain untuk mengimplementasikan antarmuka ini, dan menambahkan antarmuka ini ke kelas di atas.
// Buat objek pabrik dan unggah file objek diskfileItemFactory factory = new DiskFileItemFactory (); SERVLETFILEUPLOAD UEDLOAD = SERVLETFILEUPLOAD baru (pabrik); // Buat unggahan pendengar dan atur pendengar unggahan listener = new unggahlistener (); session.setAttribute ("pendengar", pendengar); unggah.setProgressListener (pendengar);Di bawah ini adalah kode implementasi spesifik dari kelas mendengarkan ini
Paket util.upload; impor org.apache.commons.fileupload.progressListener; kelas publik unggahListener mengimplementasikan progressListener {private volatile long bytesread = 0l, // jumlah byte contentLength yang diunggah = 0l, // Total jumlah item byte = 0l; unggahan publik () {super (); } @Override Public Void Update (Long 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; }}Sekarang Anda bisa mendapatkan informasi seperti mengunggah kemajuan, tetapi Anda masih membutuhkan servlet untuk kembali ke ujung depan. Implementasi berikut
paket util.upload; impor java.io.ioException; impor java.io.printwriter; import java.util.hashmap; impor java.util.map; javax.servlet.servletException; import javax.servlet.http.htpservlet; javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.commons.fileupload.ProgressListener;import com.google.gson.Gson;/** Get upload progress, upload path, error, upload result and other information*/public class GetProgressServlet extends Httpservlet {private static final long serialversionuid = -3596466520775012991l; DOGET VOID DOGET (HTTPSERVLETREQUEST, HTTPSERVLETRESPONSE Respons) Melempar ServletException, IoException {DOPOST (permintaan, respons); } Dopost void yang dilindungi (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {request.setcharacterencoding ("UTF-8"); response.setcharacterencoding ("UTF-8"); Unggahan listener pendengar = null; Httpsession sesi = request.getSession (); String error = (string) session.getAttribute ("error"); String result = (string) session.getAttribute ("result"); String filename = (string) session.getAttribute ("fileName"); Printwriter out = response.getWriter (); long bytesread = 0, contentLength = 0; if (session! = null) {listener = (unggahListener) session.getAttribute ("listener"); if (listener == null) {return; } else {bytesread = listener.getbytesread (); // Jumlah byte byte yang diunggah, contentLength = listener.getContentLength (); // Total byte} // format pengembalian yang didefinisikan oleh Anda sendiri adalah string rp = bytesRead +"," +contentLength +",", "," +"," +"," +"," +"," +"," +"," +"," +"," +"," +"," +"," +"," +"," +"," +"," +"," +" +", " +" +"," +" +", " +" +"," +" +", " +" +"," +" +", " +bytesREOME //System.out.println(rp); out.print (rp); /* // mengembalikan peta data format JSON <string, objek> peta = hashmap baru <string, objek> (); Map.put ("Bytesread", Bytesread); Map.put ("ContentLength", ContentLength); peta.put ("error", error); peta.put ("hasil", hasil); peta.put ("nama file", nama file); GSON GSON = GSON baru (); String json = gson.toJson (peta); out.print (json);*/ out.flush (); out.close (); }}}Kode fungsi yang diunggah di latar belakang telah ditulis. Berikut ini adalah front-end untuk mengimplementasikan unggahan, pertama-tama, html
<! Doctype html> <html> <head> <meta charset = "utf-8"/> <script type = "text/javascript" src = "js/upfile.js" charset = "utf-8" </script> <link = "stylesheet" type = "text/css" href = "href =" css/"type" Tipe = "cs" href = "HREF =" <a href = "javaScript: addOne ()"> Tambahkan </a> <div id = "target"> <input type = "file" id = "file" name = "file" onchange = "addFile (event)" multipel
Antarmuka relatif sederhana, cukup tambahkan tag, dan input yang diunggah disembunyikan.
Tampilan Upload Kemajuan Rendering Utama File CSS
#file {display: none; } .pro {width: 500px; } .pborder {position: relatif; Lebar: 500px; /* Lebar*/ perbatasan: 1px solid #b1d632; padding: 1px; } .drawpro {width: 0px; Tampilan: Blok; Posisi: kerabat; Latar Belakang: #B1D632; Warna: #333333; Tinggi: 20px; /* Tinggi*/ garis-tinggi: 20px; /* Harus konsisten dengan ketinggian sebelum teks dapat dipusatkan secara vertikal*/} .pspan {position: absolute; Lebar: 500px; Teks-Align: tengah; font-weight: tebal; }Berikutnya adalah fokus front-end, file JS
//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 = "Target"; // Idvar dari target div untuk mengunggah file httpxml = null; // objek xmlhttpRequest yang mengirimkan permintaan unggah var httpprogress = null; // xmlhttprequest objek yang mengirim informasi yang ada var information var oldfilelist = array = newray (); Array (); // Simpan daftar file yang diunggah var f_input; // Unggah objek input yang mengunggah file var flag = true; // Dapatkah file berikutnya var uurl = "unggah"; // permintaan untuk mengunggah file uRlvar gurl = "getprogress"; // unggah file cancel uRlvar gurl = "getprogress";/ nowid = 0; // idvar id dari file yang diunggah = 0; // id file terakhir dalam antrian/*** file objek*/function unggah (id, file) {this.id = id; this.file = file; this.state = 0; this.path = "";}/*** Metode inisialisasi*/window.onload = fungsi init () {f_input = document.getElementById ("file"); var tdiv = document.getElementById (targetDiv_id); var oldspan = tDiv.getElementsByTagname ("span"); untuk (var i = 0; i <oldspan.length; i ++) {oldfilelist.push (oldspan [i] .getAttribute ("name")); }}/** * Pilih file untuk mengunggah */function addone () {f_input.value = null; f_input.click ();}/*** Setelah memilih file, tambahkan objek file ke antrian dan mulai mengunggah**/fungsi addFile (evt) {var f = f_input.files [0]; if (f! = tidak terdefinisi) {var uf = unggah baru (id, f); Uplist.push (UF); var div = document.createElement ("div"); div.setAttribute ("id", "pro" + (id)); div.setAttribute ("kelas", "pro"); div.innerHtml = upfile_html; var targetDiv = document.getElementById (targetDiv_id); TargetDiv.AppendChild (Div); div.geteLementsbyTagname ("span") [1] .innerHtml = "Nama file:" + Uplist [id] .file.name; waittimer = setInterval ("unggah ()", 1000); Id ++; }}/*** Unggah file dalam unggahan queue*/function () {if (flag == true) {if (uplist.length> 0) {var uf; untuk (var i = 0; i <uplist.length; i ++) {if (uplist [i] .state == 0) {uf = uclist [i]; Uplist [i] .State = 1; merusak; }} 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 ("file", uf.file); httpup.open ("post", uurl, true); httpup.upload.addeventListener ('progress', unggahprogress, false); httpup.send (formdata); nowid = uf.id; timer = setInterval ("getp ()", 50); }}}}/*** Dapatkan informasi seperti unggah kemajuan*/fungsi getP () {if (window.xmlHttpRequest) {httpprogress = xmlHttpRequest baru (); } else if (window.activexObject) {httpprogress = new ActivexObject ("microsoft.xmlhttp"); } httpprogress.onreadystatechange = onprogress; httpprogress.open ("post", gurl, true); httpprogress.setRequestHeader ("tipe konten", "Aplikasi/X-WWW-Form-Urlencoded"); httpprogress.send ("& timestamp =" + (tanggal baru ()). getTime ());}/*** memproses informasi unggahan yang dikembalikan dan menampilkannya ke antarmuka*/fungsi onprogress () {if (httpprogress.readystate == 4 && httppress.status. var result = result.replace (/(^/s*) | (/s*$)/g, ""); var res = result.split (","); var sekarang = parseInt (res [0]); var all = parseInt (res [1]); var err = res [2]; var state = res [3]; var path = res [4]; var per = (sekarang / semua * 100) .tofixed (2); var prodiv = document.geteLementById ("pro" + nowid); if (prodiv! = null & prodiv! = tidak terdefinisi) {if (err! = "" & err! = null & err.length> 0) {window.clearInterval (timer); if (cancelflag == 1) {err = "unggah terminasi"; cancelflag = 0; } prodiv.getElementsbyTagname ("Div") [0] .style.display = "none"; prodiv.getElementsbyTagname ("span") [1] .innerHtml = err; httpup.abort (); bendera = true; uplist [nowid] .state = 3; kembali; } if (state == "ok") {prodiv.geteLementsByTagname ("div") [0] .style.display = "none"; var tmpf = evlist [nowid] .file; prodiv.getElementsbyTagname ("span") [1] .innerHtml = "Nama file:" + tmpf.name; window.clearinterval (timer); bendera = true; uplist [nowid] .state = 2; Uplist [nowid] .path = path; kembali; } prodiv.getElementsbyTagname ("Div") [1] .style.width = per * 5 + "px"; prodiv.getElementsbyTagname ("span") [0] .innerHtml = per + "%"; }}}/*** Metode untuk membatalkan unggahan*/fungsi aborortupload (obj) {var idstr = obj.parentnode.id; var id = idstr.slice (3); if (uplist [id] .state == 1) {httpup.abort (); bendera = true; cancelflag = 1; } else {evlist [id] .state = 3; } document.getElementById (idstr) .remove ();}/*** Dapatkan path untuk mengunggah file* @returns formatted string*/function getFileListStr () {var str = ""; if (oldfileList.length> 0) {for (var i = 0; i <oldfilelist.length; i ++) {if (oldFilelist [i]! = null & oldfilelist [i]! = "" & oldfilelist [i]! = Tidak terdefinisi) {str = str + oldfilelist [i] [i] " +", "", ""; " }}} untuk (var i = 0; i <uplist.length; i ++) {var f = uplist [i]; if (f.state == 2) {str = str + f.path + ","; }} return str;}/*** Hapus lampiran lama yang sudah ada ketika modifikasi**/function RemoveOld (btn) {var num = btn.getAttribute ("name"); OldFilelist [num - 1] = null; btn.parentnode.remove ();} fungsi unggahProgress (e) {if (e.lengthcomputable) {var ihytesuploaded = E.Loaded; var Ibytestotal = e.total; document.geteLementById ("test"). innerHtml = IbytesUploaded+"/"+Ibytestotal; }} Gunakan AJAX untuk mengirim file unggah untuk mendapatkan kemajuan unggahan, hasil dan informasi lainnya.
API file HTML5 yang digunakan adalah IE9 atau di atas harus kompatibel. Firefox memiliki masalah. Permintaan AJAX tidak segera kembali. Hasil yang sama akan dikembalikan sampai semua permintaan AJAX dikirim, yang akan menghasilkan kemajuan unggahan yang tidak ditampilkan. Namun, Anda juga dapat menggunakan HTML5 File API untuk mendapatkannya, yang memiliki sedikit kode yang ditambahkan. Nilai dalam div uji di bawah halaman adalah kemajuan yang diperoleh di ujung depan.
Semua file yang diunggah telah diimplementasikan, dan kemudian file sementara yang diunggah diproses. Karena file bernama UUID digunakan, banyak file akan dihasilkan, dan yang tidak berguna perlu diproses secara teratur. Menggunakan ServletContextListener:
Ada antarmuka ServletContextListener di API Servlet, yang dapat mendengarkan siklus hidup objek ServletContext, yang sebenarnya merupakan siklus hidup aplikasi web.
Ketika wadah Servlet memulai atau mengakhiri aplikasi web, acara ServletContextEvent dipicu, yang ditangani oleh ServletContextListener. Dua metode didefinisikan dalam antarmuka ServletContextListener untuk menangani acara ServletContextEvent.
Menggunakan fitur -fiturnya, fungsi menghapus file sementara secara teratur direalisasikan. Kodenya adalah sebagai berikut:
Paket util.upload; impor java.io.ioException; import java.io.inputstream; import java.util.date; import java.util.properties; impor java.util.timer; impor java.util.timertask; impor javax.servlet.servletext; javax.servlet.servletcontextListener;/ ** * waktu pendengar * * */ kelas publik tempfileListener mengimplementasikan servletcontextListener {private timer timer; SystemTaskTest SystemTask Private; string statis privat every_time_run; statis {properties prop = properti baru (); InputStream instrem = tempfileManager.class.getClassLoader () .getResourceAsstream ("tempfile.properties"); coba {prop.load (instrem); System.out.println (instrem); every_time_run = prop.getProperty ("Every_time_run"); } catch (ioException e) {e.printstacktrace (); } akhirnya {coba {instrem.close (); } catch (ioException e) {e.printstacktrace (); }}} // Metode awal pendengar public void contextInitialized (servletContextEvent scCe) {timer = timer baru (); SystemTask = new SystemTaskTest (sce.getSerVletContext () .getRealPath ("/"), sce.getServletContext ()); coba {System.out.println ("Timer Start"); // pendengar mendapatkan direktori root dari situs web string path = scce.getServletContext (). GetRealPath ("/"); Lama = long.parselong (every_time_run) * 1000; // Waktu untuk Loop Execution System.out.println ("Time" + Time); // Parameter pertama adalah kode yang akan dijalankan, parameter kedua adalah ketika mulai berjalan, dan parameter ketiga adalah seberapa sering ia berjalan. Ulangi eksekusi timer.schedule (SystemTask, 10000, waktu); System.out.println ("Jadwal tugas telah ditambahkan"); } catch (Exception e) {E.PrintStackTrace (); }} public void contextDestroyed (servletContextEvent scaling) {try {timer.cancel (); } catch (Exception e) {}}} / *** Time Tasker** / class SystemTaskTest memperluas timerKask {private servletContext konteks; jalur string pribadi; Public SystemTaskTest (string path, konteks servletContext) {this.path = path; this.context = konteks; } / *** Letakkan tugas yang akan dieksekusi secara teratur dalam run* / public void run () {TempFileManager ETF; coba {System.out.println ("Mulai tugas!"); // kode yang akan dijalankan system.out.println (tanggal baru (). TolocaleString ()); ETF = TempfileManager baru (Path); etf.run (); System.out.println ("Tentukan eksekusi tugas selesai!"); } catch (Exception e) {E.PrintStackTrace (); }}}Di atas hanyalah pendengar, yang bertanggung jawab untuk memanggil metode untuk menghapus file sementara secara teratur. Implementasi spesifik adalah kelas berikut
Paket util.upload; impor java.io.file; import java.io.ioexception; import java.io.inputstream; import java.util.date; java.util.properties;/*** hapus file di server*/class public class tempfileManager menandatangani runnable {hapus porping; "1440"; // Waktu untuk penyimpanan file adalah satu hari statis {properties prop = properti baru (); InputStream instrem = tempfileManager.class.getClassLoader () .getResourceAsstream ("execl.properties"); coba {prop.load (instrem); Retention_time = prop.getProperty ("file_retention_time"); } catch (ioException e) {e.printstacktrace (); } akhirnya {coba {instrem.close (); } catch (ioException e) {e.printstacktrace (); }}} /*** Konstruktor. Parameter Inisialisasi * @param Path */ TempfileManager Publik (Jalur String) {this.path = path; } / *** Masukkan kode yang ingin dijalankan oleh utas di run ()* / public void run () {System.out.println ("Manajemen File Start =======================================; Path; Path; System.out.println (" Management; "Path========; Path; System.out.println (" DeleteFiles (File); if (candeleteFile (folder)) {if (folder.delete ()) {System.out.println ("Folder" + folder.getName () + "Hapus dengan sukses!"); = 0; Temui kriteria if (candeleteFile (file)) {if (file.delete ()) {system.out.println ("file" + file.getName () + "hapus berhasil!"); } else {System.out.println ("File" + File.getName () + "Hapus Gagal! File ini dapat digunakan"); }} else {}} else {System.out.println ("Tidak ada file yang akan dihapus"); }} catch (Exception e) {System.out.println ("Hapus file gagal ============="); e.printstacktrace (); }} / *** Tentukan apakah file tersebut dapat dihapus* / private boolean candeleteFile (file file) {date fileDate = getFileDate (file); Tanggal Tanggal = Tanggal Baru (); Long Time = (date.getTime () - FileDate.getTime ()) / 1000 /60 - integer.parseint (retention_time); // menit antara waktu saat ini dan interval file // system.out.println ("waktu =="+waktu); if (time> 0) {return true; } else {return false; }} / ** * Dapatkan waktu modifikasi terakhir dari file * * @param file * @return * / private date getFiledate (file file) {long modifiedTime = file.lastModified (); Tanggal D = Tanggal Baru (ModifiedTime); kembali D; }}Tentukan apakah file diuraikan, dan folder dapat dihapus secara otomatis jika diatur waktunya.
Di atas adalah semua tentang artikel ini, saya harap akan sangat membantu bagi semua orang untuk belajar pemrograman Java.