Написание Java -версии Simple Cloud Album, реализованные функции:
Пользователи могут загружать один на несколько файлов одновременно.
Пользователи могут скачать картинки, загруженные другими.
Пользователи могут просматривать фотографии всех остальных.
Пользователи могут удалять изображения, загруженные только через свой собственный IP.
Используются методы:
Загрузка и загрузка файлов, режим дизайна, DOM4J, XPath и т. Д.
Давайте посмотрим на следующие две страницы:
исходный код:
web.xml:
<? xml version = "1.0" Encoding = "utf-8"?> <web-app arser = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema electsmance "/www.w3. xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <shiple-mame> </display-name> <servlet> <servlet> ropletserverserser </servlet-nameserserser nameser nameser nameser nameerser nameser nameser name name name name name d <servlet-class>cn.hncu.servlets.UploadServlet</servlet-class> </servlet> <servlet> <servlet-name>cloudPhotoServlet</servlet-name> <servlet-class>cn.hncu.servlets.cloudPhotoServlet</servlet-class> </servlet> <servlet> <servlet-name>DownServlet</servlet-name> <servlet-class>cn.hncu.servlets.DownServlet</servlet-class> </servlet> <servlet> <servlet-name>DelServlet</servlet-name> <servlet-class>cn.hncu.servlets.DelServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>cloudPhotoServlet</servlet-name> <url-pattern>/cloudPhoto</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-mapping> <servlet-name>DownServlet</servlet-name> <Url-pattern>/Servlet/Downservlet </url-pattern> </servlet-mapping> <servlet> <servlet-name> delservlet </servlet-name> <url-pattern>/Servlet/delservlet </url-pattern> </servlet-mapping> <selcoceply-file> <delcomefile> index.jsp </jestremple> </servlet> <delcess-file> <dhownly-file> index.jsp </jestremple> </werving-file-list> </web-app>
index.jsp:
<%@ page language = "java" import = "java.util.*" pageencoding = "UTF-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <Head> <Title> Cloud Cloud </title> <Script type = javist "> javict '> javict'> javist"> = input.parentelement.parentelement.parentelement; // table.nodename tbody table.removechild (input.parentelement.parentelement); } var t = 1; функция addFile (input) {tr = input.parentelement.parentelement; //Alert(tr.nodeName); var str = "<td> select file: </td>"+ "<td> <input type = 'file' name = 'file"+ t+ "'> </td>"+ "<td> Файл Описание: </td>"+ "<td> <input type = 'text' name = 'text"+ "'> </td>"+ " onclick = 'delfile (this)'> </td> "; tr.insertadjacenthtml ("перед Begin", str); } function move () {window.location.href = "/myphoto/cloudphoto"; } </script> <style type = "text/css"> #font {color: red; } </style> </head> <body> <h1> <font id = "font"> ubload album: </font> </h1> <form action = "/myphoto/upload" method = "post" ectype = "multiply/form-data"> <table> <tr> <td> select file: </td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> "<td>" <td> " <td> File description: </td> <td> <input type="text" name="text1"> </td> <td> <input type="button" value="delete file" onclick="delFile(this)"> </td> </tr> <tr> <td colspan=2> <input type="submit" value="upload file"> </td> <td colspan=3> <input type="button" value="add file" onclick="addFile(this)"> </td> </tr> </table> </form> <form action="/myPhoto/cloudPhoto" method="post" enctype="multipart/form-data"> <table> <tr> <td colspan=5><input type="submit" value="enter the cloud album" onclick = "move ()"> </td> </tr> </table> </form> </body> </html>photo.xml:
<? xml version = "1.0" Encoding = "UTF-8"?> <Фото> </photos>
Myutils.java:
пакет cn.hncu.utils; import java.text.simpledateformat; import java.util.date; import java.util.uuid; открытый класс myutils { / ** * @return get uuid * / public Static String getUuid () {return uuid.randomuuid (). } / ** * @param uuid * @return Получите сломанный путь через uuid * / public Static String getDir (String uuid) {String dir1 = integer.tohexstring (uuid.hashcode () & 0xf); String dir2 = integer.tohexstring ((uuid.hashcode () & 0xf0) >> 4); вернуть "/"+dir1+"/"+dir2; } // Формат даты частный статик SimpleDateFormat SDF = new SimpleDateFormat ("Yyyyy Year MM Month DD DATE HH: MM: SS"); / *** @return возвращает дату и время при загрузке*/ public static String getCurrentDateTime () {return sdf.format (new Date ()); }}Dom4Jfactory.java:
Пакет cn.hncu.utils; import java.io.fileinputstream; import java.io.filenotfoundexception; импорт java.io.fileoutputstream; импорт java.io.ioexception; импорт java.io.unsupportedExexexexexexexexexex; импорт; импорт; импорт; импорт; org.dom4j.element; импорт org.dom4j.node; import org.dom4j.io.saxReader; импорт org.dom4j.io.xmlWriter; открытый класс dom4Jfactory {частный статический документ dom = null; частный статический путь строки; // Статический блок! Будет работать только один раз! Особенность заключается в том, что когда класс загружен, static {try {saxreader sax = new Saxreader () выполняется; // Поскольку наши ресурсы были опубликованы из милипса на сервер Tomcat, он отличается от оригинального проекта Pure Java. // Используйте текущий класс, чтобы найти его загрузчик класса, а затем получить путь ресурса через загрузчик класса. path = dom4jfactory.class.getClassloader (). getResource ("photo.xml"). getPath (); // getClassLoader () возвращает: Загрузка загрузчика класса класса или интерфейса, представленного этим объектом // public url getResource (string name) возвращает: чтение объекта URL ресурса; Если ресурс не может быть найден, или у абонента нет достаточного разрешения для получения ресурса, верните NULL. // Этот метод сначала ищет родительский класс ресурса; Если родительский загрузчик класса является нулевым, путь поиска-это путь встроенного класса-загрузчика виртуальной машины. // public String getPath () Получает часть пути этого URL. System.out.println (path); dom = sax.read (new FileInputStream (path)); } catch (filenotFoundException e) {бросить новое runtimeexception (e); } catch (documentException e) {бросить новое runtimeexception (e); }} / ** * @return Получить документ альбома * / public Static Document getDocument () {return dom; } / ** * Сохранить photo.xml и сохранить в локальном * / public static boolean save () {try {xmlwriter w = new XmlWriter (new FileOutputStream (path)); W.Write (dom); w.close (); вернуть истину; } catch (UnsupportEncodingException e) {return false; } catch (filenotFoundException e) {return false; } catch (ioException e) {return false; }} public static boolean del (string uuid) {node node = dom.selectsinglenode ("[@uuid = '"+uuid+"']"); if (node == null) {вернуть false; } node.getParent (). remove (node); вернуть истину; } / *** test* @param args* / public static void main (string [] args) {System.out.println (getDocument ()); }}PhotoModel.java - объект значения
package cn.hncu.domain;/** * Value object encapsulation* @author Chen Haoxiang* 2016-7-24 */public class PhotoModel { private String uuid;//uuid private String realName="";//The real file name of the picture (file name when uploading) private String ext;//The suffix name private String dir;//The path after breaking private String dateTime;//The time of Загрузка файла Private String IP; // IP -загрузка IP Private String Desc; // Описание файла public String getUuid () {return uuid; } public void setUuID (string uuid) {this.Uuid = uuid; } public String getRealName () {return realName; } public void setRealName (String RealName) {this.RealName = realName; } public String getExt () {return Ext; } public void setext (string ext) {this.ext = ext; } public String getDir () {return dir; } public void setDir (String dir) {this.dir = dir; } public String getDateTime () {return dateTime; } public void setDateTime (String DateTime) {this.DateTime = dateTime; } public String getip () {return ip; } public void setip (String ip) {this.ip = ip; } public String getDesc () {return desc; } public void setDesc (String desc) {this.desc = desc; } @Override public String toString () {return "photomodel [uuid =" + uuid + ", realName =" + realName + ", ext =" + ext + ", dir =" + dir + ", dateTime =" + dateTime + ", ip =" + ip + ", desc =" + desc + "]"; }}Photodao.java:
пакет cn.hncu.photodao.dao; import java.util.list; import cn.hncu.domain.photomodel; public interface photodao { / *** @param photo* @return Сохранить данные* / public boolean save (photodel photo); / *** @return вернуть всю информацию о изображении*/ public list <fotoModel> getAll (); / *** @param uuid* @return Найти объект инкапсулированного значения через uuid*/ public photomodel getinglybyuuid (string uuid); / ** * @param uuid * @return Удалить информацию изображения в Photo.xml через uuid */ public boolean deletexml (string uuid); / ** * @param dir * @return Удалить информацию изображения на серверном диске через путь */ public boolean deletefile (String pathfilename);}Photoserimpl.java:
Пакет cn.hncu.photodao.impl; import java.io.file; import java.util.arraylist; import java.util.iterator; import java.util.list; import org.dom4j.document; import org.dom4j.element; импорт org.dom4j.node; импорт. cn.hncu.photodao.dao.photodao; import cn.hncu.utils.dom4jfactory; public class photoserimpl реализует Photodao {@override public boolean save (photoModel photo) {document dom = dom4jfactory.getDocument (); Элемент root = dom.getRootElement (); // добавить элемент атрибута p = root.addelement ("photo"); P.Addattribute ("uuid", photo.getUuid ()); P.Addattribute ("realName", photo.getRealName ()); P.Addattribute ("dateTime", photo.getDateTime ()); P.Addattribute ("ip", photo.getip ()); P.Addattribute ("EXT", photo.getext ()); P.Addattribute ("dir", photo.getDir ()); P.Addattribute ("desc", photo.getDesc ()); return dom4jfactory.save (); } @Override public list <fhotomodel> getall () {list <photoModel> list = new ArrayList <FotoModel> (); Документ dom = dom4jfactory.getDocument (); Элемент root = dom.getRootElement (); Итератор <element> it = root.elementiterator ("photo"); // Получить итератор элемента фотосъемка через Dom4j, и вы также можете найти все фотографии через xpath // list <node> lists = dom.selectnodes ("// photo [@uuid]"); // итератор <node> it = lists.iterator (); while (it.hasnext ()) {element e = it.next (); Фотомодель фото = новая фотомодель (); photo.setuuid (e.attributevalue ("uuid")); photo.setRealName (e.attributeValue ("realName")); photo.setDateTime (e.attributeValue ("dateTime")); photo.setext (e.attributevalue ("ext")); photo.setip (e.attributevalue ("ip")); photo.setdir (e.attributevalue ("dir")); photo.setdesc (e.attributevalue ("desc")); list.add (фото); } return List; } @Override public photomodel getinglebyuuid (string uuid) {list <photoModel> photos = getAll (); для (фотомодель фото: фото) {if (photo.getUuid (). Equals (uuid)) {return Photo; }} return null; } @Override public boolean deletexml (string uuid) {document dom = dom4jfactory.getDocument (); Элемент e = (элемент) dom.selectsinglenode ("// photo [@uuid = '"+uuid.trim ()+"']"); вернуть e.getParent (). Удалить (e); } @Override public boolean deletefile (string pathfilename) {try {file file = new File (pathfilename); if (file.exists ()) {file.delete (); } вернуть true; } catch (Exception e) {return false; }}}PhotodaOfactory.java:
Пакет cn.hncu.photodao.factory; import cn.hncu.photodao.impl.photoserimpl;/*** Заводский метод* @author Chen haoxiang* 2016-7-24*/public photodaofactory {public Statice Photoserimpl GetPotodao () {return New PhotoSpletory; }}Uploadservlet.java:
Пакет cn.hncu.servlets; импорт java.io.file; import java.io.ioexception; импорт java.io.printwriter; import java.util.list; импорт javax.servlet.servletexception; import.servlet.http.httpserververververserverservserv. javax.servlet.http.httpservletresponse; import org.apache.commons.fileupload.fileitem; import org.apache.commons.fileupload.fileuploadexcept org.apache.commons.fileupload.servlet.servletfileupload; импорт cn.hncu.domain.photomodel; импорт cn.hncu.photodao.dao.photodao; импорт cn.hncu.photodao.factory.photodaofactor cn.hncu.utils.myutils; открытый класс uploadservlet расширяет httpservlet {public void doget (httpservletrequest, httpservletresponse response) vestletexception, ioexception {response.setContentType ("text/html; charsexception, ioException {respons. response.getWriter (). print ("<h1> Извините, эта страница не поддерживает получить доступ !!! </h1>"); response.getWriter (). print ("<a href = 'javascript: inistory.go (-1)'> вернуться на предыдущую страницу </a>"); } public void dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {response.setContentType ("text/html; charset = utf-8"); Final PrintWriter Out = response.getWriter (); // Анти-черно-нон-multipart form pression // Использовать инструмент загрузки Boolean boo = ServletFileUpload.ismultipartContent (запрос); if (! boo) {out.print ("<h1> не поддерживает метод подачи обычных форм! </h1>"); возвращаться; } File file = new File ("d:/photoCache"); if (! file.exists ()) {file.mkdir (); } Diskfileitemfactory fifactory = new DiskFileItemFactory (1024*10, file); ServletFileUpload upload = new ServletFileUpload (fifactory); upload.setheAderencoding ("utf-8"); // Установить имя файла кодирование строки = getServletContext (). getRealPath ("/photos"); Fileitem fi = null; try {list <fieleItem> list = opload.parserequest (request); Photomodel Photo = new PhotoModel (); // Инкапсуляция данных --- 7 Свойства требуются Photo.SetRealName ("" "); int cont = 0; for (fileitem f: list) {if (cont! = 0 && cont%2 == 0 &&! photo.getRealName (). equals ("")) {photo = new photoModel (); // re-data encapsulation} fi = f; if (fi.isformfield ()) {// нормальная форма формы // получить файл Описание string desc = fi.getString ("UTF-8"); photo.setDesc (desc); //#1} else {// anti-black 3-если файл не выбран в компоненте файла if (fi.getSize () == 0) {photo.setRealName (""); продолжение ++; продолжать; } String fileName = fi.getName (); filename = filename.substring (filename.lastindexof ("//")+1); // реальное имя файла photo.setRealName (filename); //#2 string ext = filename.substring (filename.lastindexof (". photo.setDateTime (myutils.getCurrentDateTime ()); //#4 photo.setip (request.getRemoteaddr ()); //#5 string uuid = myutils.getuuid (); photo.setUuid (uuid); //#6 photo.setDir (myutils.getdir (uuid)); //#7 // разрушить файл каталога dfile = new File (path+photo.getDir ()); if (! dfile.exists ()) {dfile.mkdir (); } fi.write (новый файл (path+photo.getDir ()+"/"+photo.getUuid ()+photo.getext ())); } продолжение ++; if (cont%2 == 0 &&! photo.getRealName (). equals ("")) {photodao dao = photodaOfactory.getPhotodao (); boo = dao.save (фото); // Сохранить в диск - Метод 2: fileUtils.copyInputStreamToFile (in, новый файл (файл (filename2)); // ※ 2 ※ Хранение файла изображения на сервер Hard Disk Photo = new PhotoModel (); // Re -Encapsulation}}} Catch (fileuploadexception e) {e.printstacktrace ()}}} catch (fileuploadexception e) {e.printstacktrace (); } catch (Exception e) {e.printstackTrace (); } наконец {if (fi! = null) {fi.delete (); } if (dom4jfactory.save ()) {out.print ("<h1> Загружено успешно! </h1>"); out.print ("<a href = 'javascript: vistory.go (-1)'> вернуться на предыдущую страницу </a>"); } else {out.print ("<h1> загрузка не удалась! </h1>"); out.print ("<a href = 'javascript: vistory.go (-1)'> вернуться на предыдущую страницу </a>"); }}}}Показать все файлы -cloudphotoservlet.java
Пакет cn.hncu.servlets; импорт java.io.ioexception; import java.io.printwriter; import java.util.list; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.http.httreplectrevlet; import javax.servlet.http.httrep.httpservlet; import javax.servlet.htt javax.servlet.http.httpservletresponse; import cn.hncu.domain.photomodel; import cn.hncu.photodao.dao.photodao; импорт cn.hncu.photodao.fotodaofactory; public cloudphotoserv extends https veserl Doget (httpservletrequest -запрос, httpservletresponse response) Throws ServletException, ioException {String pwd = (String) request.getParameter ("pwd"); if ("chx" .equals (pwd)) {dopost (запрос, ответ); } else {response.setContentType ("text/html; charset = utf-8"); response.getWriter (). print ("<h1> Извините, у вас нет разрешения на доступ !!! </h1>"); }} public void dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {response.setContentType ("text/html; charset = utf-8"); Printwriter Out = response.getWriter (); out.println ("<! Doctype html public/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<Head> <tite> CHX Cloud Album </title> </head>"); out.println ("<body>"); out.println ("<table border = '1px; double;#ff0000'>"); out.println ("<tr>"); out.println ("<tr>"); out.println ("<td> имя файла </td>"); out.println ("<td> загрузить время"); out.println ("<td> file </td>"); out.println ("<td> Описание файла </td>"); out.println ("<Td> Operation </TD>"); out.println ("</tr>"); String tdwh = "style = 'width: 200px; высота: 200px;'"; // показать все картинки PhotoDao dao = photodaOfactory.getPhotodao (); Список <photomodel> photos = dao.getall (); для (фотомодель фото: фото) {String filename = photo.getRealName (); String time = photo.getDateTime (); // Выходная картина String PATH = request.getContextPath () + "/photos/" + photo.getDir () + "/" + photo.getUuid () + photo.getext (); // System.out.println (path); // /myphoto/photos//7/c/a1237a48a6aa451cb22fa78b15bafcea.jpg string img = "<a href = '" + path + "'> <img src = '" + path + "'/> </a>"; String desc = photo.getDesc (); String delstr = "<a href = '/myphoto/servlet/delservlet? Uuid =" + photo.getuuid () + "'> delete </a>"; String downstr = "<a href = '/myphoto/servlet/downservlet? Uuid =" + photo.getUuid () + "'> Скачать </a>"; out.println ("<td" + tdwh + ">" + filename + "</td>"); out.println ("<td" + tdwh + ">" + time + "</td>"); out.println ("<td" + tdwh + ">" + img + "</td>"); out.println ("<td" + tdwh + ">" + desc + "</td>"); out.println ("<td" + tdwh + ">" + delstr + "" + downstr + "</td>"); out.println ("</tr>"); } out.println ("<tr>"); out.println ("</tr>"); out.println ("</table>"); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); }}Удалить файл - delservlet.java
Пакет cn.hncu.servlets; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.htp.httpservlectrequest; javax.servlet.http.httpservletresponse; import cn.hncu.domain.photomodel; import cn.hncu.photodao.dao.photodao; импорт cn.hncu.photodao.fotodaofactory; public class delservlet extends htTp dao = photodaofactory.getPhotodao (); public void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioException {DoPost (запрос, ответ); } public void dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {string uuid = request.getParameter ("uuid"); String ip = request.getRemoteaddr (); response.setContentType ("text/html; charset = utf-8"); Printwriter Out = response.getWriter (); Photomodel Photo = dao.getsinglebyuuid (uuid); if (photo! = null) {if (! photo.getip (). equals (ip)) {out.print ("<h1> у вас нет разрешения на удаление этого файла!!! </h1>"); out.print ("<a href = 'javascript: vistory.go (-1)'> вернуться на предыдущую страницу </a>"); возвращаться ; } // 1. Удалить информацию в базе данных Boolean boo = dao.deletexml (uuid); if (boo) {string fileName = "photo/"+photo.getDir ()+"/"+photo.getUuid ()+photo.getext (); String pathfilename = getServletContext (). GetRealPath (имя файла); if (dao.deletefile (pathfilename)) {// перенаправить на страницу альбома response.sendreedirect ("/myphoto/cloudphoto? Pwd = chx"); } else {out.print ("<h1> не может быть удален с сервера, файл занят !!! </h1>"); out.print ("<a href = 'javascript: vistory.go (-1)'> вернуться на предыдущую страницу </a>"); }} else {out.print ("<h1> файл больше не существует !!! </h1>"); out.print ("<a href = 'javascript: vistory.go (-1)'> вернуться на предыдущую страницу </a>"); }}}}Скачать файл -downservlet.java
Пакет cn.hncu.servlets; import java.io.fileinputstream; import java.io.ioexception; импорт java.io.inputstream; импорт java.io.outputstream; импорт java.net.urlencoder; импорт javax.servletexception; импорт. javax.servlet.http.httpservlectrequest; import javax.servlet.http.httpservletresponse; импорт cn.hncu.domain.photomodel; импорт cn.hncu.photodao.dao.photodao; импорт cn.hncu.photodao.pactory.photory.photory.photory. Downservtlet Extens httpservlet {phate photodao dao = photodaofactory.getPhotodao (); public void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioException {DoPost (запрос, ответ); } public void dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {string uuid = request.getParameter ("uuid"); System.out.println (uuid); Photomodel Photo = dao.getsinglebyuuid (uuid); System.out.println (фото); if (photo! = null) {// Установить заголовок ответа-контент-приемник-когда браузер увидит этот заголовок ответа, он откроет программу загрузки, которую он считает // (если гром будет распознан, гром автоматически откроется, если нет, «сохранение файла как« диалоговое окно будет открыт) response.setContentTepe («Приложение/сильная загрузка»); String realName = photo.getRealName (); String Agent = request.getheader ("пользовательский агент"); System.out.println (агент); if (Agent.Indexof ("mozilla")! =-1) {// Ответ браузера Firefox.setheader ("Содержимое-дискозиа", "ATTHAMENT; FILENAME ="+ new String (realName.getBytes ("GB2312"), "isO-8859-1")); } else {// Решить проблему искаженного китайского (просто используйте следующее предложение, чтобы кодировать имя файла) realName = urlencoder.encode (realName, "utf-8"); // Используйте указанный механизм кодирования для преобразования строки в приложение/xwww-formoded. response.setheader ("Distosition", "ATTHAMENT; FILENAME =/" "+realName+"/""); // Примечание: "cttachment;" не может отсутствовать, иначе браузер откроется непосредственно в новом окне} string fileName = "photo/"+photo.getDir ()+"/"+photo.getUuid ()+photo.getext (); String pathfilename = getServletContext (). GetRealPath (имя файла); InputStream in = new FileInputStream (PathFilename); OutputStream out = response.getOutputStream (); byte buf [] = новый байт [2048]; int len = 0; while ((len = in.read (buf))! =-1) {out.write (buf, 0, len); } out.close (); in.close (); } else {response.setContentType ("text/html; charset = utf-8"); response.getWriter (). println ("<h1> Этот файл был удален </h1>"); }}}Демонстрационные результаты
Я не буду демонстрировать это, перед ним есть картинки, и я дал все исходные коды. Если вы заинтересованы, вы можете сделать некоторые улучшения самостоятельно.
Фактически, это также может загружать любой другой тип файлов, потому что у нас нет имени защитного суффикса, и мы используем потоковую передачу символов для его передачи, и оно не будет искажено (его можно обрабатывать как облачный диск ~~)! !
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.