Web---自己写的一个简单云相册(2)~

简介: Web---自己写的一个简单云相册~

PhotoSerImpl.java:

package 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;
import org.dom4j.Node;
import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.utils.Dom4jFactory;
public class PhotoSerImpl implements PhotoDao{
    @Override
    public boolean save(PhotoModel photo) {
        Document dom = Dom4jFactory.getDocument();
        Element root = dom.getRootElement();
        //添加属性
        Element 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<PhotoModel> getAll() {
        List<PhotoModel> list = new ArrayList<PhotoModel>();
        Document dom = Dom4jFactory.getDocument();
        Element root = dom.getRootElement();
        Iterator<Element> it = root.elementIterator("photo");
        //通过DOM4J获得photo元素的迭代器,也可以通过xPath来找到所有的 photo
        //List<Node> lists = dom.selectNodes("//photo[@uuid]");
        //Iterator<Node> it = lists.iterator();
        while(it.hasNext()){
            Element e = it.next();
            PhotoModel photo = new PhotoModel();
            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(photo);
        }
        return list;
    }
    @Override
    public PhotoModel getSingleByUuid(String uuid) {
        List<PhotoModel> photos=getAll();
        for(PhotoModel photo:photos){
            if(photo.getUuid().equals(uuid)){
                return photo;
            }
        }
        return null;
    }
    @Override
    public boolean deleteXml(String uuid) {
        Document dom = Dom4jFactory.getDocument();
        Element e = (Element) dom.selectSingleNode("//photo[@uuid='"+uuid.trim()+"']");
        return e.getParent().remove(e);
    }
    @Override
    public boolean deleteFile(String pathFileName) {
        try {
            File file = new File(pathFileName);
            if(file.exists()){
                file.delete();
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}


PhotoDaoFactory.java:


package cn.hncu.photoDao.factory;
import cn.hncu.photoDao.impl.PhotoSerImpl;
/**
 * 工厂方法
 * @author 陈浩翔
 * 2016-7-24
 */
public class PhotoDaoFactory {
    public static PhotoSerImpl getPhotoDao(){
        return new PhotoSerImpl();
    }
}

上传-UploadServlet.java:

package cn.hncu.servlets;
import java.io.File;
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 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 cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;
import cn.hncu.utils.Dom4jFactory;
import cn.hncu.utils.MyUtils;
public class UploadServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("<h1>很抱歉,本页面不支持GET方式访问!!!</h1>");
        response.getWriter().print("<a href='javascript:history.go(-1)'>返回上一页</a> ");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        final PrintWriter out = response.getWriter();
        //防黑-非multipart表单提交
        //使用上传工具的方式
        boolean boo = ServletFileUpload.isMultipartContent(request);
        if(!boo){
            out.print("<h1>不支持普通表单的提交方式!</h1>");
            return;
        }
        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");//设置文件名编码
        String path = getServletContext().getRealPath("/photos");
        FileItem fi = null;
        try {
            List<FileItem> list = upload.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();//重新数据封装
                }
                fi=f;
                if(fi.isFormField()){//普通表单组件
                    //得到文件说明
                    String desc = fi.getString("utf-8");
                    photo.setDesc(desc);//#1
                }else{
                    //防黑3-如果在file组件中不选择文件
                    if(fi.getSize()==0){
                        photo.setRealName("");
                        cont++;
                        continue;
                    }
                    String fileName = fi.getName();
                    fileName = fileName.substring( fileName.lastIndexOf("\\")+1);//真实文件名
                    photo.setRealName(fileName);//#2
                    String ext = fileName.substring(fileName.lastIndexOf("."));//扩展名
                    photo.setExt(ext);//#3
                    photo.setDateTime(MyUtils.getCurrentDateTime());//#4
                    photo.setIp( request.getRemoteAddr() );//#5
                    String uuid = MyUtils.getUUID();
                    photo.setUuid(uuid);//#6
                    photo.setDir( MyUtils.getDir(uuid) );//#7
                    //打散目录
                    File dFile = new File(path+photo.getDir());
                    if(!dFile.exists()){
                        dFile.mkdirs();
                    }
                    fi.write(new File(path+photo.getDir()+"/"+photo.getUuid()+photo.getExt()));
                }
                cont++;
                if(cont%2==0 && !photo.getRealName().equals("")){
                    PhotoDao dao = PhotoDaoFactory.getPhotoDao();
                    boo = dao.save(photo);
                    //存入磁盘-法二:FileUtils.copyInputStreamToFile(in, new File(fileName2));//※2※ 把图片文件存储到服务器硬盘
                    photo = new PhotoModel();//重新数据封装
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(fi!=null){
                fi.delete();
            }
            if(Dom4jFactory.save()){
                out.print("<h1>上传成功!</h1>");
                out.print("<a href='javascript:history.go(-1)'>返回上一页</a> ");
            }else{
                out.print("<h1>上传失败!</h1>");
                out.print("<a href='javascript:history.go(-1)'>返回上一页</a> ");
            }
        }
    }
}


显示所有文件-cloudPhotoServlet.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.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;
public class cloudPhotoServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String pwd = (String) request.getParameter("pwd");
        if ("chx".equals(pwd)) {
            doPost(request, response);
        } else {
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().print("<h1>很抱歉,你没有权限访问!!!</h1>");
        }
    }
    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>CHX云相册</TITLE></HEAD>");
        out.println("  <BODY>");
        out.println("<table border='1px' bordercolor='red'>");
        out.println("<tr>");
        out.println("<td>文件名</td>");
        out.println("<td>上传时间");
        out.println("<td>文件</td>");
        out.println("<td>文件说明</td>");
        out.println("<td>操作</td> ");
        out.println("</tr>");
        String tdWH = "style='width:200px; height:200px;'";
        // 显示所有图片
        PhotoDao dao = PhotoDaoFactory.getPhotoDao();
        List<PhotoModel> photos = dao.getAll();
        for (PhotoModel photo : photos) {
            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() + "'>删除</a>";
            String downStr = "<a href='/myPhoto/servlet/DownServlet?uuid="
                    + photo.getUuid() + "'>下载</a>";
            out.println("<tr>");
            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 + "&nbsp;" + 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

package cn.hncu.servlets;
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.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;
public class DelServlet extends HttpServlet {
    //注入
    private PhotoDao dao = PhotoDaoFactory.getPhotoDao();
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, 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:history.go(-1)'>返回上一页</a> ");
                return ;
            }
            //1.删除数据库中的信息
            boolean boo = dao.deleteXml(uuid);
            if(boo){
                String fileName = "photos/"+photo.getDir()+"/"+photo.getUuid()+photo.getExt();
                String pathFileName = getServletContext().getRealPath(fileName);
                if(dao.deleteFile(pathFileName)){
                    //重定向到相册页面
                    response.sendRedirect("/myPhoto/cloudPhoto?pwd=chx");
                }else{
                    out.print("<h1>无法从服务器中删除,文件正在被占用!!!</h1>");
                    out.print("<a href='javascript:history.go(-1)'>返回上一页</a> ");
                }
            }else{
                out.print("<h1>该文件已经不存在!!!</h1>");
                out.print("<a href='javascript:history.go(-1)'>返回上一页</a> ");
            }
        }
    }
}


下载文件-DownServlet.java

package cn.hncu.servlets;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;
public class DownServlet extends HttpServlet {
    private PhotoDao dao = PhotoDaoFactory.getPhotoDao();
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String uuid = request.getParameter("uuid");
        System.out.println(uuid);
        PhotoModel photo = dao.getSingleByUuid(uuid);
        System.out.println(photo);
        if(photo!=null){
            //设置响应头--内容接收程序--浏览器看到这个响应头,就会把它认为的下载程序打开
            //(如果识别迅雷那么就会自动打开迅雷,如果没有则会打开一个“文件另存为”的对话框)
            response.setContentType("application/force-download");
            String realName = photo.getRealName();
            String agent = request.getHeader("User-Agent");
            System.out.println(agent);
            if(agent.indexOf("Mozilla")!=-1){//火狐浏览器
                response.setHeader("Content-Disposition", "attachment;filename="+ new String(realName.getBytes("GB2312"),"ISO-8859-1"));
            }else{
                //解决中文乱码问题(只要用下面一句对文件名进行编码就行了)
                realName = URLEncoder.encode(realName, "utf-8");//使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。
                response.setHeader("Content-Disposition", "attachment;filename=\""+realName+"\"");
                //注意:“cttachment;”不能少,否则浏览器会直接在新窗口中打开
            }
            String fileName = "photos/" + photo.getDir()+"/"+photo.getUuid()+photo.getExt();
            String pathFileName = getServletContext().getRealPath(fileName);
            InputStream in = new FileInputStream(pathFileName);
            OutputStream out = response.getOutputStream();
            byte buf[] = new byte[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>");
        }
    }
}

演示结果

这个我就不演示啦,图片在前面也有,所有的源码我都给了。有兴趣的可以自己取改进一下咯。

其实这个还能上传其他任意类型文件哦,因为我们没有防护后缀名的,而且我们是用字符流传输,全都不会失真(可以当云盘来处理了~~)!!

目录
相关文章
|
前端开发
Web前端实现3D旋转魔方相册【超详细】
Web前端实现3D旋转魔方相册【超详细】
863 0
|
设计模式
Web---自己写的一个简单云相册(1)~
Web---自己写的一个简单云相册~
151 0
Web---自己写的一个简单云相册(1)~
|
Web App开发 XML JavaScript
Web---自己写的一个简单云相册~
实现的功能是: 用户可以一次上传一个至多个文件。 用户可以下载其他人上传的图片。 用户可以查看其他所有人的图片。 用户只能删除通过自己IP上传的图片。 用到的技术: 文件上传下载、设计模式、Dom4j、xPath等。
981 0
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
101 3
|
17天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
105 45
|
13天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
29 1
|
16天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
18天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
31 2
WK
|
18天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
27 0