相册管理系统
功能文件的上傳,下載和管理
技術:1.用xml當做數據庫存儲信息(dom4j,xpath)
2.Java表單的文件上傳和下載
3.文件目錄的打散 ( Hash目錄是一種優化文件存儲性能的方法)
需要的jar包:
commons-fileupload-1.2.2.jar、commons-io-2.1.jar、dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar
先寫index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>相冊管理系統</title></head><body><h1>我的小相冊</h1><a href="jsps/upload.jsp">上傳相冊</a><a href="servlets/ShowServlet">瀏覽相冊</a></body> </html>upload.jsp是下載頁面放在jsps目錄下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head></head><body><h1>相處上傳</h1><form action="<%=request.getContextPath()%>/servlets/UploadServlet"method="post" enctype="multipart/form-data">文件:<input type="file" name="file1"/><br/>說明:<input type="text" name="desc" /><br/><input type="submit" value="上傳" /></form></body></html>photos.xml放在src目錄下
<?xml version="1.0" encoding="UTF-8"?> <photos> </photos>在寫值對象PhotoModel
package cn.hncu.demain;public class PhotoModel {private String id;private String realName;private String ext;private String dir;private String dateTime;private String ip;private String desc;public String getId() {return id;}public void setId(String id) {this.id = id;}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;}@Overridepublic String toString() {return "PhotoModel [id=" + id + ", realName=" + realName + ", ext="+ ext + ", dir=" + dir + ", dateTime=" + dateTime + ", ip="+ ip + ", desc=" + desc + "]";}}寫工具類兩個:
MyUtil(日期格式化,目錄打散代碼,隨機id代碼)
Dom4jFactory(dom4j的相關操作,獲取document對象,保存操作)
package cn.hncu.utils;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter;public class Dom4jFactory {private static Document dom = null;private static String path;static {try {SAXReader sax = new SAXReader();// 學習一下服務器下的資源路徑加載方式(因為我們的資源已經從MyEclipse中發布到Tomcat服務器中了,所以跟原來純Java項目不一樣了)// 利用當前類找到它的類加載器,然后通過該類加載器再去獲得資源路徑path = Dom4jFactory.class.getClassLoader().getResource("photos.xml").getPath();dom = sax.read(new FileInputStream(path));} catch (Exception e) {throw new RuntimeException(e.getMessage(), e);}}public static Document getDom(){return dom;}public static boolean save(){try {OutputFormat format=new OutputFormat();format.setEncoding("utf-8");XMLWriter w = new XMLWriter( new FileOutputStream(new File(path)),format);w.write(dom);w.close();return true;} catch (Exception e) {return false;}} }從底層寫PhotoDao
package cn.hncu.dao;import java.util.ArrayList; import java.util.Iterator; import java.util.List;import org.dom4j.Document; import org.dom4j.Element;import cn.hncu.demain.PhotoModel; import cn.hncu.utils.Dom4jFactory;public class PhotoDao {//添加public boolean add(PhotoModel photo){Document dom=Dom4jFactory.getDom();Element root=dom.getRootElement();Element ePhoto=root.addElement("photo");ePhoto.addAttribute("id", photo.getId());ePhoto.addAttribute("realName", photo.getRealName());ePhoto.addAttribute("dir", photo.getDir());ePhoto.addAttribute("ip", photo.getIp());ePhoto.addAttribute("dateTime", photo.getDateTime());ePhoto.addAttribute("ext", photo.getExt());ePhoto.addElement("desc").setText(photo.getDesc());boolean boo=Dom4jFactory.save();return boo;}//瀏覽public List<PhotoModel> getAll(){Document dom=Dom4jFactory.getDom();List<PhotoModel> list=new ArrayList<PhotoModel>();Element root=dom.getRootElement();Iterator<Element> it=root.elementIterator();while(it.hasNext()){PhotoModel photo=new PhotoModel();Element e=it.next();photo.setId(e.attributeValue("id"));photo.setDateTime(e.attributeValue("dateTime"));photo.setDir(e.attributeValue("dir"));photo.setExt(e.attributeValue("ext"));photo.setIp(e.attributeValue("ip"));photo.setRealName(e.attributeValue("realName"));photo.setDesc(e.elementText("desc"));list.add(photo);}return list;}public PhotoModel getSingleById(String id) {Document dom=Dom4jFactory.getDom();List<PhotoModel> list=getAll();for(PhotoModel photo:list){if(photo.getId().equals(id)){return photo;}}return null;}public boolean del(String id) {Document dom=Dom4jFactory.getDom();Element e=(Element) dom.selectSingleNode("//photo[@id='"+id.trim()+"']");return e.getParent().remove(e);} }最后寫四個servlet
UploadServlet 上傳Servlet代碼
ShowServlet 瀏覽相冊的Servlet端
package cn.hncu.servlets;import java.io.IOException; import java.io.PrintWriter; import java.util.List;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import cn.hncu.dao.PhotoDao; import cn.hncu.demain.PhotoModel;public class ShowServlet extends HttpServlet {IOException if an error occurredpublic void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println(" <BODY>");String table="<table border='1' width='100%'>"+"<tr><th>文件名</th><th>上傳ip</th><th>上傳時間</th><th>圖片</th><th>說明</th><th>操作</th></tr>";out.print(table);PhotoDao dao=new PhotoDao();List<PhotoModel> list=dao.getAll();for(PhotoModel p:list){out.print("<tr>");out.println("<td>"+p.getRealName()+"</td>");out.println("<td>"+p.getIp()+"</td>");out.println("<td>"+p.getDateTime()+"</td>");//輸出圖片String path=request.getContextPath()+"/photos/"+p.getDir()+"/"+p.getId()+p.getExt();out.println("<td><a href='"+path+"'><img src='"+path+"' width='200' height='200'></img></a></td>");String op="<a href='"+request.getContextPath()+"/servlets/DelServlet?id="+p.getId()+"'>刪除</a> ";out.println("<td>"+p.getDesc()+"</td>");op+="<a href='"+request.getContextPath()+"/servlets/DownServlet?id="+p.getId()+"'>下載</a>";out.println("<td>"+op+"</td>");out.print("</tr>");}out.println("</table>");out.println(" </BODY>");out.println("</HTML>");out.flush();out.close();}}DownServlet 下載的服務器代碼
package cn.hncu.servlets;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URLEncoder;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import cn.hncu.dao.PhotoDao; import cn.hncu.demain.PhotoModel;public class DownServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String id=request.getParameter("id");response.setContentType("application/force-download");PhotoModel p=new PhotoDao().getSingleById(id);if(p!=null){String realName=p.getRealName();realName=new String(realName.getBytes("iso8859-1"),"utf-8");response.setHeader("content-Disposition", "attachment;filename=\""+realName+"\"");String relpath=getServletContext().getRealPath("/photos/"+p.getDir()+"/"+p.getId()+p.getExt());InputStream in=new FileInputStream(relpath);OutputStream out=response.getOutputStream();System.out.println(relpath);byte buf[]=new byte[1024];int len=0;while ((len=in.read(buf))!=-1){out.write(buf,0,len);}out.close();}else{response.setContentType("text/html;charset=utf-8");response.getWriter().println("該文件已經被刪除!");}}}Delservlet 刪除操作的服務器
package cn.hncu.servlets;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import cn.hncu.dao.PhotoDao; import cn.hncu.demain.PhotoModel;public class DelServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter out=response.getWriter();String id=request.getParameter("id");PhotoModel p=new PhotoDao().getSingleById(id);if(p!=null){if(!p.getIp().equals(request.getRemoteAddr())){out.println("你無權進行刪除!");return;}//※※※※以下部分課后補敲的!!!!//1刪除數據庫中的信息PhotoDao dao=new PhotoDao();boolean boo=dao.del(id);//2把服務器硬盤中的文件刪除if(boo){String fileName="photos/"+p.getDir()+"/"+p.getId()+p.getExt();String pathFileName = getServletContext().getRealPath(fileName);File f=new File(pathFileName);if(f.exists()){f.delete();}String strPath = request.getContextPath()+"/servlets/ShowServlet";out.println("相片刪除成功!<a href='"+strPath+"'>瀏覽相冊</a>");}else{out.println("相片刪除失敗!");}}else{response.setContentType("text/html;charset=utf-8");response.getWriter().println("該文件不存在!");}} }總結
- 上一篇: Matlab中s函数的使用
- 下一篇: C#音效播放PlaySound