Недавно проект должен быть загружен файл. После завершения работы поделитесь ею, а также делайте заметки.
Функция загрузки реализована в фоновом режиме и Java, а фронт в основном реализуется в JS Ajax. Фон также добавляет временные файлы для регулярного удаления.
Эффект, как показано на картинке
Прежде всего, основной класс функции загрузки, ниже приведен код
пакет util.upload; import java.io.file; import java.io.ioexception; импорт java.text.simpledateformat; import java.util.date; импорт java.util.iterator; import java.util.list; import java.util.uuid; import javax.servlet.servletexception; javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; import org.apache.commons.fileplaud.file org.apache.commons.fileupload.disk.diskFileItemFactory; import org.apache.commons.fileUpload.servlet.servletfileUpload; открытый класс uploadservlet extmends httpservlet {private static final long long erialversionuid = -31000284223713221159l; Частный логический подход; частная строка upFileName; // Определить массив с помощью юридического суффикса имя Private String [] AllieDextName = new String [] {"Zip", "rar", // Сжатие файла «txt», «doc», «WPS», «docx», «java», // текст «xls», «xlsx», // таблица «ppt», «pptx», // Slide "pdf", // play "f" jpg "," bmp "," Gif ", Png // picture}; Ответ httpservletresponse) бросает Servletexception, ioException {dopost (запрос, ответ); 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 Максимальное значение для загруженного файла, который не должен превышать 100 МБ int maxsize = 100*1024*1024; ServletFileUpload upload = new ServletFileUpload (Factory); // Создать загрузку прослушивателя и установить прослушивание overloadlistener alinger = new uploadlistener (); session.setattribute ("Слушатель", слушатель); upload.setProgressListener (слушатель); // загружать путь String Path = request.getSession (). GetServletContext (). GetRealPath ("/upload"); String requestPath = request.getSession (). GetServletContext (). GetContextPath ()+"/upload"; File dirfile = new File (path); //System.out.println(Request.getSession (). GetServletContext (). GetContextPath ()); // Если папка не существует, создайте if (! Dirfile .exists () &&! Dirfile .isdirectory ()) {dirfile .mkdir (); } // Создать папку на основе даты и сохранить ее в папку с соответствующей датой датой = новая дата (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyyMmdd"); String subdirname = sdf.format (date); File subdirfile = new File (path+"/"+subdirname); if (! subdirfile .exists () &&! subdirfile .isdirectory ()) {subdirfile .mkdir (); } try {// parse upload Quepring List <fieleTem> items = opload.parserequest (request); Iterator <fieTiTem> itr = item.iterator (); while (itr.hasnext ()) {fileitem item = (fileitem) itr.next (); // Определите, является ли это файловым доменом if (! Item.isformfield ()) {if (item.getName ()! = Null &&! Item.getName (). Equals ("")) {// Получить загруженный размер файла и имя файла long upFileSize = item.getSize (); String fileName = item.getName (); // Получить имя суффикса файла string [] splitName = fileName.split ("//"); String extname = splitName [splitName.length-1]; // Проверьте имя суффикса файла на наличие (строка разрешена: allowedextName) {if (Alfor.EqualsIgnoreCase (extname)) {isAllowed = true; }} if (! islowed) {error = "Формат файла загрузки незаконен!"; перерыв; } if (upFilesize> maxSize) {error = "Файл, который вы загружаете, слишком большой, выберите файл, который не превышает 100 МБ!"; перерыв; } // В настоящее время файл временно хранится в памяти сервера, создавая временный файл объекта Tempfile = новый файл (MakeFilename (FileName)); // Укажите имя каталога и файла файла файла сервера загрузки файла = новый файл (path+"/"+subdirname+"/", tempfile.getname ()); item.write (file); // Первый метод написания файла upFilename = requestPath+"/"+subdirname+"/"+tempfile.getName (); if (upfilename.equals ("" ")) {error =" Нет выбора для загрузки файла! "; } System.out.println (upFileName); /*// Создание второго метода написания файла считывания входного потока файл inputStream IS = item.getInputStream (); int length = 0; byte [] by = new Byte [1024]; FileOutputStream fos = new FileOutputStream (file); while ((length = is.read (by))! =-1) {fos.write (by, 0, length); //Thread.sleep(10); } fos.close (); //Thread.sleep(1000); */} else {error = "Нет выбора для загрузки файла!"; }}}} catch (Exception e) {e.printstacktrace (); Ошибка = "Произошла ошибка при загрузке файла:"+e.getmessage (); } if (! error.equals ("")) {System.out.println (erry); session.setattribute ("error", ошибка); } else {session.setattribute ("result", "ok"); session.setattribute ("filename", upfilename); }} / *** Чтобы предотвратить перезапись файла, необходимо сгенерировать уникальное имя файла для загрузки файла* @param Filename Имя файла* @return Уникальное имя файла* / частная строка MakeFilename (String Filename) {return uuid.randomuuid (). ToString () + "_" + filename; }} Необходимо ввести Commons-FileUpload-1.3.1.jar и Commons-IO-2.4.jar
В процессе загрузки нам необходимо получить информацию, такую как загрузка прогресса в режиме реального времени. Введенная библиотека добавила для нас интерфейс ProgressListener. Мы напишем еще один класс для реализации этого интерфейса и добавим этот интерфейс в вышеуказанный класс.
// Создание заводских объектов и объектов загрузки файлов diskfileitemfactory factory = new DiskFileItemFactory (); ServletFileUpload upload = new ServletFileUpload (Factory); // Создать загрузку прослушивателя и установить прослушивание overloadlistener alinger = new uploadlistener (); session.setattribute ("Слушатель", слушатель); upload.setProgressListener (слушатель);Ниже приведен конкретный код реализации этого класса прослушивания
пакет util.upload; import org.apache.commons.fileupload.progresslistener; открытый класс uploadlistener реализует ProgressListener {private volatile Long BytesRead = 0l, // количество загруженных байт ContentLength = 0l, // общее количество байтов Item = 0l; public uploadlistener () {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; }}Теперь вы можете получить информацию, такую как загрузка прогресса, но вам все еще нужен сервлет, чтобы вернуться на переднюю часть. Следующая реализация
пакет util.upload; импорт java.io.ioexception; import java.io.printwriter; импорт java.util.hashmap; import java.util.map; импорт javax.servlet.servletexception; import javax.servlet.http.httpservlet; import.servlet.http.http.httpservlet; javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; import org.apache.commons.fileupload.progresslistener; импорт com.google.gson.gson;/** Получите прогресс загрузки, rupload, erroad restrector Частный статический последний длинный серийный режим = -3596466520775012991L; Защищенная void Doget (httpservletrequest, httpservletresponse response) бросает ServletException, ioException {DoPost (запрос, ответ); } Защищенный void Dopost (httpservletRequest, httpservletresponse response) throws servletexception, ioexception {request.setcharacterencoding ("utf-8"); response.setcharacterencoding ("UTF-8"); Uploadlistener alluster = null; Httpsession session = 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) {слушатель = (uploadlistener) session.getattribute ("Слушатель"); if (слушатель == null) {return; } else {bytesRead = слушатель.getBytesRead (); // Количество загруженных байт contentLength = wirliner.getContentLength (); // Общее количество байтов} // формат возврата, определяемый самим собой, является строкой rp = bytesred +"," +contentlength +"," +errom +"," +result +"," +fillename; //System.out.println(rp); out.print (rp); /* // return json format map <string, object> map = new hashmap <string, object> (); map.put ("Bytesread", Bytesread); map.put ("contentLength", contentLength); map.put ("ошибка", ошибка); map.put («результат», результат); map.put ("имя файла", имя файла); Gson Gson = new Gson (); String json = gson.tojson (map); out.print (json);*/ out.flush (); out.close (); }}}Код функции, загруженный в фоновом режиме, был записан. Ниже приведен фронт для реализации загрузки, прежде всего, 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 = "css/css 'href =" csss/urbile. <body> <a href = "javascript: addonone ()"> add </a> <div id = "target"> <input type = "file" id = "file" name = "file" onchange = "addfile (event)" multipm/> </div> <span id = "test"> 0 </span> </body> </html> </div> <span = "> 0 </span> </body> </html>
Интерфейс относительно прост, просто добавьте тег, и загруженный вход скрыт.
Отображение прогресса загрузки основного рендеринга файла CSS
#file {display: none; } .pro {width: 500px; } .pborder {позиция: относительно; Ширина: 500px; /* Ширина*/ граница: 1px sold #b1d632; Заполнение: 1px; } .drawpro {width: 0px; дисплей: блок; позиция: относительно; Фон: #B1D632; Цвет: #333333; Высота: 20px; /* Высота*/ Линия-высота: 20px; /* Он должен соответствовать высоте до того, как текст может быть вертикально центрирован*/} .pspan {position: Absolute; Ширина: 500px; Текст-альбом: Центр; шрифт-вес: жирный шрифт; }Далее сосредоточен на переднем фокусе, файл JS
// htmlvar upfile_html, который отображает информацию о загрузке: «<div> <div> ' +' <pan> 0%</span> </div> </div> <span name =" path "> </span> <img src =" common/upload/images/del.png "style =" right "name =" del "Onclick = abortApl (this)>>>>>>>> varupd (varioPlic abrolAd (this aBortAp «Target»; // IDVAR целевого DIV для загрузки файла httpxml = null; // xmlhttprequest объект, который отправляет запрос на загрузку var httpprogress = null; // xmlhttprequest объект, который отправляет информацию о ходе запроса varfilelist = new Array (). Array (); // Сохранить список загруженных файлов var f_input; // загружать объект ввода, который загружает файл var flag = true; // может ли следующий флаг файла var uurl = "upload"; // Запрос на загрузку файла urlvar gurl = "getProgress"; // Загрузить файл urlvar cancelf = 0; // adcel flag, wither varemer timer, wither varemer; 0; // IDVAR ID файла, загруженного = 0; // ID последнего файла в очереди/*** Файл объект*/функция oploadfile (id, file) {this.id = id; this.file = file; this.state = 0; this.path = "";}/*** Метод инициализации*/window.onload = function init () {f_input = document.getElementById ("file"); var tdiv = document.getElementById (targetDiv_id); var oldspan = tdiv.getelementsbytagname ("span"); for (var i = 0; i <oldspan.length; i ++) {oldfilelist.push (oldspan [i] .getattribute ("name")); }}/** * Выберите файл для загрузки */function addone () {f_input.value = null; f_input.click ();}/*** После выбора файла добавьте объект файла в очередь и запустите загрузку**/function addfile (evt) {var f = f_input.files [0]; if (f! = undefined) {var uf = new uploadfile (id, f); uplist.push (uf); var div = document.createElement ("div"); div.setattribute ("id", "pro" + (id)); div.setattribute ("class", "pro"); div.innerhtml = upfile_html; var targetDiv = document.getElementByid (targetDiv_id); targetdiv.appendchild (div); div.getElementsbytagname ("span") [1] .innerhtml = "Имя файла:" + uplist [id] .file.name; waittimer = setInterval ("upload ()", 1000); Id ++; }}/*** Загрузить файл в очередь*/function upload () {if (flag == true) {if (uplist.length> 0) {var uf; for (var i = 0; i <uplist.length; i ++) {if (uplist [i] .state == 0) {uf = uplist [i]; Uplist [i] .state = 1; перерыв; }} 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 («Прогресс», uploadprogress, false); httpup.send (formdata); nowid = uf.id; timer = setInterval ("getP ()", 50); }}}}/*** Получить информацию, такую как прогресс загрузки*/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 ("контент-тип", "Application/xwww-form-urlencoded"); httpprogress.send ("& timestamp =" + (new Date ()). getTime ());}/*** Обработайте возвращенную информацию о загрузке и отобразите ее в интерфейс*/function OnProgress () {if (httpprogress.readystate == 4 && httppress.Status == 200) {resusttpesteStepresteSteStepresteSteSteSe var result = result.replace (/(^/s*) | (/s*$)/g, ""); var res = result.split (","); var теперь = parseint (res [0]); var All = parseint (res [1]); var err = res [2]; var state = res [3]; var path = res [4]; var per = (теперь / все * 100) .tofixed (2); var prodiv = document.getElementbyId ("pro" + nowid); if (prodiv! = null & prodiv! = undefined) {if (err! if (cancelflag == 1) {err = "upload vermination"; CANCELFLAG = 0; } prodiv.getElementsbytagname ("div") [0] .style.display = "none"; prodiv.getelementsbytagname ("span") [1] .innerhtml = err; httpup.abort (); flag = true; Uplist [nowid] .state = 3; возвращаться; } if (state == "ok") {prodiv.getElementsbytagname ("div") [0] .style.display = "none"; var tmpf = uplist [nowid] .file; prodiv.getelementsbytagname ("span") [1] .innerhtml = "Имя файла:" + tmpf.name; window.clearinterval (таймер); flag = true; Uplist [nowid] .state = 2; Uplist [nowid] .path = path; возвращаться; } prodiv.getElementsbytagname ("div") [1] .style.width = per * 5 + "px"; prodiv.getelementsbytagname ("span") [0] .innerhtml = per + "%"; }}}/*** Метод для отмены загрузки*/function abortupload (obj) {var idstr = obj.parentnode.id; var id = idstr.slice (3); if (uplist [id] .state == 1) {httpup.abort (); flag = true; CANCELFLAG = 1; } else {uplist [id] .state = 3; } document.getElementById (idStr) .Remove ();}/*** Получить путь к загрузке файла* @returns форматированной строки*/function getFileListstr () {var str = ""; if (oldfilelist.length> 0) {for (var i = 0; i <oldfilelist.length; i ++) {if (oldfilelist [i]! = null & oldfilelist [i]! }}} for (var i = 0; i <uplist.length; i ++) {var f = uplist [i]; if (f.state == 2) {str = str + f.path + ","; }} return str;}/*** Удалить старое вложение, которое уже было там, когда модификация**/function removeOLD (btn) {var num = btn.getAttribute ("name"); OldFilelist [num - 1] = null; btn.parentnode.remove ();} функция uploadprogress (e) {if (e.lengthcompatable) {var ibytesuploaded = e.loaded; var ibytestotal = e.total; document.getElementbyId ("test"). innerHtml = ibytesuploaded+"/"+ibytestotal; }} Используйте Ajax для отправки файлов загрузки, чтобы получить прогресс загрузки, результаты и другую информацию.
Используемый API файла HTML5 IS, поэтому IE9 или выше должны быть совместимыми. У Firefox есть проблема. Запросы Ajax не возвращаются сразу. Тот же результат будет возвращен до тех пор, пока не будут отправлены все запросы AJAX, что приведет к тому, что прогресс загрузки не будет отображаться. Тем не менее, вы также можете использовать API файла HTML5, чтобы получить его, в котором добавлен небольшой код. Значение в тестовом DIV под страницей является прогресс, полученный на передней части.
Все загруженные файлы были реализованы, а затем обрабатываются загруженные временные файлы. Поскольку используются именованные файлы UUID, будет сгенерировано много файлов, а бесполезные необходимо обрабатывать регулярно. Использование ServletContextListener:
В API Servlet есть интерфейс ServletContextListener, который может прослушать жизненный цикл объекта ServletContext, который на самом деле является жизненным циклом веб -приложения.
Когда контейнер сервлета запускается или заканчивает веб -приложение, запускается событие ServletContexTextent, которое обрабатывается ServletContextListener. Два метода определены в интерфейсе ServletContextListener для обработки события ServletContexTexTent.
Используя свои функции, функция регулярного удаления временных файлов реализуется. Код заключается в следующем:
пакет util.upload; импорт java.io.ioexception; import java.io.inputstream; import java.util.date; import java.util.properties; импорт java.util.tile; импорт java.util.timertask; импорт javax.servlet.servletcontext; javax.servlet.servletContextListener;/ ** * Время слушатель * * */ public Class TempfileListener реализует ServletContextLister {частный таймер таймера; Частный SystemTaskTest SystemTask; частная статическая строка wyly_time_run; static {свойства prop = new Properties (); Inputstream intrem = tempfileManager.class.getClassLoader () .getResourCeasStream ("tempfile.properties"); try {prop.load (instrem); System.out.println (Enmerm); wyver_time_run = prop.getProperty ("wyally_time_run"); } catch (ioException e) {e.printstackTrace (); } наконец {try {instrem.close (); } catch (ioException e) {e.printstackTrace (); }}} // Прослушивающий начальный метод публичный void contextInitialized (ServletContexTevent Scce) {timer = new Timer (); SystemTask = new SystemTaskTest (sce.getServletContext () .getRealPath ("/"), sce.getServletContext ()); try {System.out.println ("таймер запустил"); // Слушатель получает корневой каталог веб -сайта String Path = scce.getServletContext (). GetRealPath ("/"); Давно = long.parselong (wyally_time_run) * 1000; // Время для системы выполнения цикла. // Первый параметр - это код для запуска, второй параметр - это когда он начинает работать, а третий параметр - это то, как часто он работает. Повторное выполнение Timer.schedule (SystemTask, 10000, время); System.out.println («График задач был добавлен»); } catch (Exception e) {e.printstackTrace (); }} public void contextDestroyed (ServletContexTevent Scal) {try {timer.cancel (); } catch (Exception e) {}}} / *** Time Tasker** / Class SystemTaskTest Extends TimerTask {Private ServletContext Context; частный путь строкости; public SystemTaskTest (String Path, Context ServletContext) {this.path = path; this.context = context; } / *** Поместите задачу, которая будет регулярно выполняться в запуске* / public void run () {tempfileManager etf; try {System.out.println ("запустить задачу!"); // код для выполнения System.out.println (new Date (). Tolocalestring ()); etf = new TempfileManager (Path); etf.run (); System.out.println («Укажите, что выполнение задачи завершено!»); } catch (Exception e) {e.printstackTrace (); }}}Выше приведено просто слушатель, который отвечает за вызов метода для регулярного удаления временных файлов. Конкретная реализация - это следующий класс
пакет util.upload; import java.io.file; import java.io.ioexception; import java.io.inputstream; import java.util.date; импорт java.util.properties;/*** Удалить файл на сервере**/public tempfilemanager ullipments {private String Path ;// patch static static static static static static static static static station static static static static Время для хранения файлов - однодневный статический {свойства prop = new Properties (); Inputstream instrem = tempfileManager.class.getClassLoader () .getResourCeasStream ("excl.properties"); try {prop.load (instrem); Hestention_time = prop.getProperty ("file_retention_time"); } catch (ioException e) {e.printstackTrace (); } наконец {try {instrem.close (); } catch (ioException e) {e.printstackTrace (); }}} /*** Конструктор. Параметры инициализации * @param path */ public tempfileManager (String Path) {this.path = path; } / *** Поместите код, который поток хочет выполнить в run ()* / public void run () {system.out.println ("start management ======================================================================================================== DeleteFiles (File); if (candeletefile (folder)) {if (folder.delete ()) {System.out.println ("folder" + folder.getName () + "Удалить успешно!"); i = 0; которые соответствуют критериям if (candeletefile (file)) {if (file.delete ()) {System.out.println ("file" + file.getName () + "Удалить успешно!"); } else {System.out.println ("file" + file.getName () + "Удалить не удастся! Этот файл может использоваться"); }} else {}} else {System.out.println ("Нет файла для удаления"); }} catch (Exception e) {System.out.println ("Удалить файл не удастся ============="); e.printstacktrace (); }} / *** Определите, можно ли удалить файл* / private boolean candeletefile (файл файла) {date filedate = getFiledate (file); Дата дата = новая дата (); долгое время = (date.gettime () - filedate.gettime ()) / 1000/60 - integer.parseint (hareation_time); // минуты между текущим временем и интервалом файла // system.out.println ("time =="+time); if (time> 0) {return true; } else {return false; }} / ** * Получить последнее время изменения файла * * @param file * @return * / private date getFileDate (файл файла) {long modifiedtime = file.lastmodified (); Дата D = новая дата (модифицированное время); возврат D; }}Определите, может ли файл временам, и папка может быть удалена автоматически, если он истечет.
Выше приведено все об этой статье, я надеюсь, что для всех будет полезно изучать программирование Java.