热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

javaWEB实现相册管理的简单功能

这篇文章主要介绍了javaWEB实现相册管理的简单功能,包括图片的上传、统一浏览、单个下载、单个删除,还有一个功能只能删除自己上传的文件,感兴趣的小伙伴们可以参考一下

这仅仅只是一个小小的相册管理,主要实现的功能:能够实现对图片的上传,统一浏览,单个下载,单个删除,只能删除自己上传的文件。
现在对每个功能进行单个的解释:
图片的上传 
图片的上传在之前的文章中写的很清楚了,点击打开链接:《JavaEE实现前后台交互的文件上传与下载》 。
在这个相册管理中,就不是单一的文件传了,还需要涉及到很多参数供其他功能模块的使用

//上传文件一般采用外面的 apache的上传工具包 
 /* 
 * 我们需要将上传的文件放到指定的文件夹下 
 * 要获得文件的信息 文件名 要存储的文件夹(打散) uuid--dir 
 * 解决中文问题存储的文件名 uuid.jpg 
 * 每个人都有自己的权限 ip 
 * 上传的时间  dt 
 * 文件原先的真是名字 relName 
 * 相片的说明 desc 
 * 文件的扩展名 ext 
 *上面上传一个图片需要这么多的信息,,所以 采用 值对象《VO》封装采用打乱文件夹存储,让性能更优。 
 */ 
 request.setCharacterEncoding("utf-8"); 
 response.setContentType("text/html;charset=utf-8"); 
 PrintWriter out=response.getWriter(); 
 
 //读文件用到apache的两个包 
 //临时存储目录 
 File f =new File("f:/ex/temp");//存放临时文件的目录 
 DiskFileItemFactory dff=new DiskFileItemFactory(1024*1024*20, f);//允许临时存储文件大小为20M 
 
 //解析的文件的工具 
 ServletFileUpload sf =new ServletFileUpload(dff); 
 sf.setSizeMax(1024*1024*50);//允许存储容量为50M 
 sf.setFileSizeMax(1024*1024*20);//单个文件最大容量为 20M 
 
 String path=getServletContext().getRealPath("/upFile");//获得文件的所在磁盘的路径--》存储位置 
 Photo p =new Photo(); 
 InputStream in=null;//拷贝流需要 
 boolean boo=false; 
 FileItem f0=null;//用来删除临时文件 
 try { 
 List list=sf.parseRequest(request); 
 for(FileItem ff:list){ 

//前面的都是和之前的那个说的差不多,具体的统计参数就是从这里开始。 

 f0=ff; 
 if(ff.isFormField()){//这个为描述的内容 
  String name=ff.getString("utf-8");//采用utf-8的编码方式去读 
  p.setDesc(name);//1 文件的描述 
 }else{ 
  String name=ff.getName();//获得文件本框里面的内容--->整个图片的目录 
  //System.out.println("name:"+name); 
  String id=UtilsFactory.getUUid(); 
  p.setId(id);//6 
  String dirs=UtilsFactory.getDir(id);//获得文件夹目录----使用uuid一一打散了的 
  p.setDir(dirs);//2 打乱之后的目录 
  p.setDt(UtilsFactory.getDate());//3 时间 
  String relname=name.substring(name.lastIndexOf("/")+1); 
  p.setRelName(relname);//4 文件的真实名字 
  String ext=name.substring(name.lastIndexOf(".")); 
  p.setExt(ext);//5 文件扩展名 
  p.setIp(request.getRemoteAddr());//7 IP 
  boo =MyDao.Add(p);//保存到xml文件中 
  if(boo){//保存成功 
  path=path+"/"+p.getDir(); 
  File f1 =new File(path);//判断文件的存储路径是否存在,不存在就创建 
  if(!f1.exists()){ 
  f1.mkdirs(); 
  } 
  in=ff.getInputStream(); 
  FileUtils.copyInputStreamToFile(in,new File(path+"/"+p.getId()+p.getExt()) ); 
  } 
 } 
 } 
 } catch (FileUploadException e) { 
 boo=false; 
 }finally{ 
 if(f0!=null){ 
 f0.delete();//删除临时文件 
 } 
 } 

上传除了统计参数,我们需要将数据存储的xml文件中,还需要将图片存储起来。等浏览的时候统一查看。
效果图:

统一浏览
浏览基本就是全部将xml文件里面的数据,读出来,然后统一读出来显示。封装在一个list中,将所有的photo数据封装在list集合中

//查询所有的对象然后封装成一个list对象返回给前端 
 public static List getAll(){ 
 
 List list=new ArrayList(); 
 Document dom =DocumentFactory.getDocument(); 
 Element root=dom.getRootElement(); 
 Iterator it=root.elementIterator();//这是根节点遍历器 
 while(it.hasNext()){ 
 Element e=(Element) it.next();//找到节点 
 Photo p =new Photo();//每一的photo地址不一样,所以必须每次新开空间 
 p.setDesc(e.attributeValue("desc"));//文件描述符 
 p.setDir(e.attributeValue("dir"));//文件目录 
 p.setDt(e.attributeValue("dt"));//时间 
 p.setExt(e.attributeValue("ext"));//文件扩展名 
 p.setId(e.attributeValue("id"));//uuid生成的id 
 p.setIp(e.attributeValue("ip")); 
 p.setRelName(e.attributeValue("relname")); 
 list.add(p); 
 } 
 return list; 
 } 

具体代码:

//浏览相册需要把所有的文件读出来。需要一一去读,所以需要去读所有的xml文件 
 response.setContentType("text/html;charset=utf-8"); 
 request.setCharacterEncoding("utf-8"); 
 PrintWriter out = response.getWriter(); 
 out.println(""); 
 out.println(""); 
 out.println(" "); 
 out.println(" "); 
 List list=MyDao.getAll();//获得所有xml文件里面的内容,数据全部封装到list中 
 String path=getServletContext().getContextPath();//进入web之后要采用相对路径才能访问的到 
 String ss=null; 
 String imgs=null; 
 String dt=null; 
 String relName; 
 String tt=null; 
 String str = ""; 
 out.write(str); 
 for(Photo p:list){ 
 relName=p.getRelName(); 
 dt=p.getDt(); 
 imgs=path+"/upFile/"+p.getDir()+"/"+p.getId()+p.getExt();//完成的文件路径加文件名 
 
 ss=""; 
 tt="";//通过id来区分他们直接的区别 可以进行删除和下载 
 out.write(ss); 
 out.write(tt); 
 } 

效果:


单个下载
下载在之前的上传和下载中都说的很清楚了,点击打开链接: 《JavaEE实现前后台交互的文件上传与下载》。

下载的代码中需要注意:需要设置相应头和文件名的传输

对于下载文件需要主要 首先需要让浏览器知道 设置头 
* response.setContentType("application/force-download");//设置相应头,告诉浏览器这是下载文件 
* 第二就是设置文件名了 
* response.setHeader("Content-Disposition","attachment;filename='"+relName+"'");//下载是那边显示的是原来文件名 

下面是具体的代码:

response.setContentType("application/force-download");//设置相应头,告诉浏览器这是下载文件 
 request.setCharacterEncoding("utf-8"); 
 
 String id=request.getParameter("id"); 
 Photo p=MyDao.getSingalByid(id);//通过id获得要下载的对象 
 //写入真实名字 
 if(p!=null){ 
 String relName1=p.getRelName(); 
 String relName=URLEncoder.encode(relName1, "utf-8"); 
 response.setHeader("Content-Disposition","attachment;filename='"+relName+"'");//下载是那边显示的是原来文件名 
 OutputStream out =response.getOutputStream();//写文件时候需要 
 //路径 
 String path="/upFile/"+p.getDir()+"/"+p.getId()+p.getExt(); 
 String path1 =getServletContext().getRealPath(path); 
 
 System.out.println(path1);//检测 
 
 InputStream in=new FileInputStream(path1); 
 
 byte[] b=new byte[1024]; 
 int len =0; 
 while((len=in.read(b))!=-1){ 
 out.write(b, 0, len); 
 } 
 
 }else{ 
 response.setContentType("utf-8"); 
 PrintWriter pw =response.getWriter(); 
 pw.write("文件不存在无法下载"); 
 } 
 } 

效果图:

删除文件
删除文件需要用到的技术相对其他功能
要匹配IP,ID这样才能让删除的时候用权限

//删除照片 
public static Map deleteByid(String ip,String id) { 
 Map map =new HashMap(); 
 Document dom =DocumentFactory.getDocument(); 
 Element ele=(Element) dom.selectSingleNode("//photo[@id='"+id.trim()+"']");//xpath的使用 
 if(ele==null){ 
 map.put("success", false); 
 map.put("msg", "已经删除"); 
 return map; 
 }else{ 
 String tempip=ele.attributeValue("ip"); 
 if(!tempip.equals(ip)){ 
 map.put("success", false); 
 map.put("msg", "你不能删除别人的照片"); 
 return map; 
 }else{ 
 map.put("success", true); 
 //访问成功后,把数据分装成一个值对象,返回给逻辑层 我们这样直接删除,只是xml文件里面的节点删除,但是已经存储的文件是没有删除的 
 Photo p =new Photo(); 
 p.setId(id); 
 p.setExt(ele.attributeValue("ext")); 
 p.setDir(ele.attributeValue("dir")); 
 map.put("photo", p); 
 
 //真正的数据删除 
 ele.getParent().remove(ele); 
 DocumentFactory.Save(); 
 return map; 
 } 
 } 
 request.setCharacterEncoding("utf-8"); 
 response.setContentType("text/html;charset=utf-8"); 
 PrintWriter out=response.getWriter(); 
 String id =request.getParameter("id");//从客户端传过来的消息 
 String ip =request.getRemoteAddr(); 
 Map map =MyDao.deleteByid(ip,id); 
 if(map.get("success").equals(false)){//这都是删除不成功的 
 out.print("消息为:"+map.get("success")); 
 }else{ 
 Photo p =(Photo) map.get("photo");//根据photo里面的文件名和路径删除文件 
 String path=getServletContext().getRealPath("upFile"); 
 String filename=path+"/"+p.getDir()+"/"+p.getId()+p.getExt();//文件的路径包括文件名 
 System.out.println(filename); 
 File f=new File(filename); 
 if(f.exists()){ 
 System.out.println(f.getName()); 
 f.delete();//删除文件 
 } 
 } 
 response.sendRedirect("LookPhoto");//重定向到显示页面 
} 

整个项目的下载链接: 《javaWEB实现相册管理的简单功能》

正在处于学习中,刚学到这个知识点,技术可能很落后了,但也愿意分享给大家,大家共同进步。


推荐阅读
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 在使用Maven进行项目构建时,由于依赖库的下载速度慢常常让人感到沮丧,这直接影响了开发效率和学习热情。幸运的是,阿里云提供了一个快速的国内镜像服务,能够显著提升Maven项目的构建速度。 ... [详细]
  • Servlet过滤器入门:实现与配置
    本文介绍如何在Java Web应用中实现和配置Servlet过滤器,通过实现`javax.servlet.Filter`接口来创建过滤器,并详细说明其在web.xml文件中的配置方法。 ... [详细]
  • 深入解析:OpenShift Origin环境下的Kubernetes Spark Operator
    本文探讨了如何在OpenShift Origin平台上利用Kubernetes Spark Operator来管理和部署Apache Spark集群与应用。作为Radanalytics.io项目的一部分,这一开源工具为大数据处理提供了强大的支持。 ... [详细]
  • 深入解析BookKeeper的设计与应用场景
    本文介绍了由Yahoo在2009年开发并于2011年开源的BookKeeper技术。BookKeeper是一种高效且可靠的日志流存储解决方案,广泛应用于需要高性能和强数据持久性的场景。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 本文详细介绍了如何在Android应用中使用GridView组件以网格形式展示数据(如文本和图像)。通过行列布局,实现类似矩阵的数据展示效果。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • PHP 中 preg_match 函数的 isU 修饰符详解
    本文详细解析 PHP 中 preg_match 函数中 isU 修饰符的具体含义及其应用场景,帮助开发者更好地理解和使用正则表达式。 ... [详细]
  • Android商城应用开发指南(第二部分):创建启动欢迎页
    大多数商城应用程序在启动时会显示一个欢迎页面,以提升用户体验。本文将指导您如何实现一个基本的欢迎页,该页面会在用户打开应用后短暂展示,随后自动跳转至主界面。 ... [详细]
author-avatar
niushenX
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有
     
相册名时间图片显示操作
"+relName+""+dt+""+"图片下载 删除图片"+"