Servlet文件上传和下载---个人相册

这个小程序有以下功能:

上传照片、下载图片、浏览图片、删除图片(需要权限)

这个程序为了省事,dao层也没有分成接口、实现类和工厂类三个部分,就直接在dao的类中实现了想要的功能了

网页就相当于是表现层,值对象也写,servlet其实就相当于业务逻辑层了


此程序需要使用到几个jar包,导入到WEB-INF下的lib目录下:

用于文件传输:commons-fileupload-1.2.2.jar和commons-io-2.1.jar

don4j对xml文件操作:dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar


在项目src下要建立一个xml文件存放上传的相片的信息,这个文件里面写上一对<photos></photos>标签,每上传一张照片就增加一对<photo>标签作为<photos>的子节点,其中photo中要添加照片的属性 id , 原文件名realName , 扩展名ext , 路径dir , 上传时间dateTime , ip地址;然后每个photo增加一个子节点<description>,其中设置text存放照片描述信息。


表现层:

主页index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  
  <body>
    <h2>小相册</h2>
    <a href="jsps/upload.jsp">上传照片</a><br/>
    <a href="showServlet">查看相册</a>
  </body>
</html>
上传照片upload.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  
  <body>
    <h2>相片上传</h2>
    <form action="<%=request.getContextPath() %>/uploadServlet" method="post" enctype="multipart/form-data">
    	文件: <input type="file" name="file" /><br/>
    	说明: <input type="text" name="description" /><br/>
    	<input type="submit" value="上传" />
    </form>
    <br/>
    <a href='javascript:history.go(-1)'>返回</a>
  </body>
</html>

值对象:

PhotoModel.java

package cn.hncu.vo;

public class PhotoModel {
	private String uuid;
	private String realName;
	private String ext;
	private String dir;
	private String dateTime;
	private String ip;
	private String description;
	
	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 getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	
	@Override
	public String toString() {
		return "PhotoModel [uuid=" + uuid + ", realName=" + realName + ", ext="
				+ ext + ", dir=" + dir + ", dateTime=" + dateTime + ", ip="
				+ ip + ", description=" + description + "]";
	}
	
}

业务逻辑层:

上传照片UploadServlet.java

package cn.hncu.servlets;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

import cn.hncu.dao.PhotoDAO;
import cn.hncu.utils.MyUtils;
import cn.hncu.vo.PhotoModel;

public class UploadServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, 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><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		
		out.print("不支持get方式提交");
		
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}
	
	public void doPost(HttpServletRequest request, 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><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		
		//处理上传文件
		DiskFileItemFactory factory=new DiskFileItemFactory();
		factory.setRepository(new File("D:/a/b"));
		ServletFileUpload upload=new ServletFileUpload(factory);
		upload.setSizeMax(1024*1024*100);
		request.setCharacterEncoding("utf-8");
		FileItem fi=null;
		try {
			List<FileItem> list=upload.parseRequest(request);
			InputStream in=null;
			boolean boo=false;
			PhotoModel photo=new PhotoModel();
			//for循环是把photo的信息封装完整,,,之后(for之后)才能把该photo对象保存到数据库
			for (FileItem fii:list){
				fi=fii;
				if (fi.isFormField()){
					String description=fi.getString("utf-8");
					photo.setDescription(description);
				} else {
					in=fi.getInputStream();
					String fileName=fi.getName();
					if (fileName==null||fileName.trim().equals("")){
						out.print("没有选择文件!<br/><a href='javascript:history.go(-1)'>返回</a>");
						return;
					} else {
						fileName=fileName.substring(fileName.lastIndexOf("/")+1);
						photo.setRealName(fileName);//文件名
						String ext=fileName.substring(fileName.lastIndexOf("."));
						photo.setExt(ext);//后缀名
						photo.setDateTime(MyUtils.getCurrentTime());//时间
						photo.setUuid(MyUtils.getUuid());//id
						photo.setDir(MyUtils.getDir(photo.getUuid()));//目录
						photo.setIp(request.getRemoteAddr());//ip地址
					}
				}
			}
			//把相片信息存储到数据库
			PhotoDAO dao=new PhotoDAO();
			boo=dao.save(photo);
			//如果上面的相片信息保存成功,那么才开始接收图片文件,把它保存到服务器硬盘
			if (boo){
				String path=getServletContext().getRealPath("/photos");
				path=path+"/"+photo.getDir();
				File file=new File(path);
				if (!file.exists()){
					file.mkdirs();
				}
				String fileName2=path+"/"+photo.getUuid()+photo.getExt();
				FileUtils.copyInputStreamToFile(in, new File(fileName2));
				out.print("上传成功!<br/><a href='javascript:history.go(-1)'>返回</a>");
			} else {
				out.print("上传失败!<br/><a href='javascript:history.go(-1)'>返回</a>");
			}
		} catch (FileUploadException e) {
			throw new RuntimeException("上传失败", e);
		} finally {
			if (fi!=null){
				fi.delete();
			}
		}
		
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}
浏览相册ShowServlet.java
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.vo.PhotoModel;

public class ShowServlet 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 {

		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><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		
		String table="<table border=1px width=600px >"+
		             	"<tr><th>文件名</th> <th>上传时间</th> <th>图片</th> <th>说明</th> <th>操作</th></tr>";
		out.print(table);
		
		//显示所有的图片
		PhotoDAO dao=new PhotoDAO();
		List<PhotoModel> list=dao.getAll();
		for (PhotoModel model:list){
			out.print("<tr>");
			
			out.print("<td width=100>"+model.getRealName()+"</td>");
			out.print("<td width=100>"+model.getDateTime()+"</td>");
			String path=request.getContextPath()+"/photos/"+model.getDir()+"/"+model.getUuid()+model.getExt();
			out.print("<td><a href='"+path+"'><img height=200 width=200 src='"+path+"'/></a></td>");
			out.print("<td width=100>"+model.getDescription()+"</td>");
			String strDelete="<a href='"+request.getContextPath()+"/deleteServlet?id="+model.getUuid()+"'>删除</a>";
			String strDownload="<a href='"+request.getContextPath()+"/downloadServlet?id="+model.getUuid()+"'>下载</a>";
			String str=strDownload+" "+strDelete;
			out.print("<td width=100>"+str+"</td>");
			
			out.print("</tr>");
		}
		out.print("</table>");
		
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}
下载文件DownloadServlet.java
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 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.vo.PhotoModel;

public class DownloadServlet 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 {
		PhotoDAO dao=new PhotoDAO();
		String id=request.getParameter("id");
		PhotoModel photo=dao.getSingleById(id);
		if (photo!=null){
			response.setContentType("application/force-download");
			String realName=photo.getRealName();
			realName=URLEncoder.encode(realName, "utf-8");
			//设置响应头,以让客户端软件下载时能够显示该文件名
			response.setHeader("content-disposition", "attachment;filename='"+realName+"'");
			String fileName="photos/"+photo.getDir()+"/"+photo.getUuid()+photo.getExt();
			String filePathName=getServletContext().getRealPath(fileName);
			InputStream in=new FileInputStream(new File(filePathName));
			OutputStream out=response.getOutputStream();
			
			int len=0;
			byte[] buf=new byte[1024];
			while ((len=in.read(buf))!=-1){
				out.write(buf, 0, len);
			}
			out.close();
		} else {
			response.setContentType("text/html;charset=utf-8");
			PrintWriter out=response.getWriter();
			out.print("该文件已被删除");
			out.print("<br/><a href='javascript:history.go(-1)'>返回</a>");
		}
	}
}
删除照片DeleteServlet.java
package cn.hncu.servlets;

import java.io.File;
import java.io.IOException;
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.vo.PhotoModel;

public class DeleteServlet 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 {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String id=request.getParameter("id");
		String ip=request.getRemoteAddr();
		
		PhotoDAO dao=new PhotoDAO();
		PhotoModel photo=dao.getSingleById(id);
		if (photo!=null){
			if (!ip.equals(photo.getIp())){
				out.print("你无权删除!<br/><a href='javascript:history.go(-1)'>返回</a>");
				return;
			}
			
			//1删除数据库中的信息
			boolean boo=dao.delete(photo.getUuid());
			//2把服务器硬盘中的文件删除
			if (boo){
				String fileName="photos/"+photo.getDir()+"/"+photo.getUuid()+photo.getExt();
				String filePathName=getServletContext().getRealPath(fileName);
				File file=new File(filePathName);
				if (file.exists()){
					file.delete();
				}
				String showPath=getServletContext().getContextPath()+"/showServlet";
				out.print("删除成功!<br/><a href='"+showPath+"'>浏览相册</a>");
			} else {
				out.print("相片删除失败<br/><a href='javascript:history.go(-1)'>返回</a>");
			}
		} else {
			out.print("该文件不存在<br/><a href='javascript:history.go(-1)'>返回</a>");
		}
	}
}


DAO层

PhotoDAO.java

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.utils.Dom4jFactory;
import cn.hncu.vo.PhotoModel;

public class PhotoDAO {
	public boolean save(PhotoModel model){
		Document dom=Dom4jFactory.getDom();
		Element root=dom.getRootElement();
		Element photoElement=root.addElement("photo");
		photoElement.addAttribute("id", model.getUuid());
		photoElement.addAttribute("ip", model.getIp());
		photoElement.addAttribute("realName", model.getRealName());
		photoElement.addAttribute("dir", model.getDir());
		photoElement.addAttribute("ext", model.getExt());
		photoElement.addAttribute("dateTime", model.getDateTime());
		photoElement.addAttribute("description", model.getDescription());
		boolean boo=Dom4jFactory.save();
		return boo;
	}
	
	public List<PhotoModel> getAll(){
		List<PhotoModel> list=new ArrayList<PhotoModel>();
		Element root=Dom4jFactory.getDom().getRootElement();
		Iterator<Element> it=root.elementIterator("photo");
		while (it.hasNext()){
			PhotoModel model=new PhotoModel();
			Element e=it.next();
			model.setDateTime(e.attributeValue("dateTime"));
			model.setDir(e.attributeValue("dir"));
			model.setExt(e.attributeValue("ext"));
			model.setIp(e.attributeValue("ip"));
			model.setRealName(e.attributeValue("realName"));
			model.setUuid(e.attributeValue("id"));
			model.setDescription(e.elementText("description"));
			list.add(model);
		}
		return list;
	}
	
	public PhotoModel getSingleById(String uuid){
		List<PhotoModel> list=getAll();
		for (PhotoModel p:list){
			if (p.getUuid().equals(uuid)){
				return p;
			}
		}
		return null;
	}
	
	public boolean delete(String id){
		Document dom=Dom4jFactory.getDom();
		Element e=(Element) dom.selectSingleNode("//photo[@id='"+id+"']");
		return e.getParent().remove(e);
	}
}

工具类
MyUtils.java
package cn.hncu.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public class MyUtils {
	public static String getUuid(){
		return UUID.randomUUID().toString().replace("-", "");
	}
	
	public static String getDir(String uuid){
		String dir1=Integer.toHexString(uuid.hashCode() & 0xf);
		String dir2=Integer.toHexString((uuid.hashCode() & 0xf0)>>4);
		String dir=dir1+"/"+dir2;
		return dir;
	}
	
	private static SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	public static String getCurrentTime(){
		return format.format(new Date());
	}
}
Dom4jFactory.java
package cn.hncu.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public class MyUtils {
	public static String getUuid(){
		return UUID.randomUUID().toString().replace("-", "");
	}
	
	public static String getDir(String uuid){
		String dir1=Integer.toHexString(uuid.hashCode() & 0xf);
		String dir2=Integer.toHexString((uuid.hashCode() & 0xf0)>>4);
		String dir=dir1+"/"+dir2;
		return dir;
	}
	
	private static SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	public static String getCurrentTime(){
		return format.format(new Date());
	}
}


效果图:
主页:

上传照片:


浏览相册:





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值