这仅仅只是一个小小的相册管理,主要实现的功能:能够实现对图片的上传,统一浏览,单个下载,单个删除,只能删除自己上传的文件。
现在对每个功能进行单个的解释:
图片的上传
图片的上传在之前的文章中写的很清楚了,点击打开链接:《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 ListgetAll(){ 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(" "); Listlist=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="";//通过id来区分他们直接的区别 可以进行删除和下载 out.write(ss); out.write(tt); } "+relName+" "+dt+" "+" "; 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 MapdeleteByid(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(); Mapmap =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实现相册管理的简单功能》
正在处于学习中,刚学到这个知识点,技术可能很落后了,但也愿意分享给大家,大家共同进步。
写下你的评论吧 !推荐阅读
在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]蜡笔小新 2024-12-25 18:48:34 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]蜡笔小新 2024-12-28 11:00:33 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]蜡笔小新 2024-12-27 21:33:33 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]蜡笔小新 2024-12-27 19:31:05 本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]蜡笔小新 2024-12-27 13:10:20 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]蜡笔小新 2024-12-27 12:17:16 本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]蜡笔小新 2024-12-27 11:39:44 2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]蜡笔小新 2024-12-26 12:56:20 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]蜡笔小新 2024-12-26 11:46:55 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]蜡笔小新 2024-12-26 10:59:04 html解决MyBatis Mapper绑定异常:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]蜡笔小新 2024-12-25 19:42:47 SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]蜡笔小新 2024-12-25 19:26:39 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]蜡笔小新 2024-12-25 17:40:33
niushenX这个家伙很懒,什么也没留下!Tags | 热门标签RankList | 热门文章
- 1poll()设置POLLPRI,"有紧迫的数据要读"到底是什么意思?
- 2对技术部门建设的一些思考想法
- 3Unity开发之导出Linxu程序在Linux系统下运行
- 4香港云主机挑选时需要注意什么
- 5连载《一个程序员的成长历程》-17.最后的项目,得了抑郁症
- 6使用Docker Compose和Spotify / kafka启动Kafka主题?
- 7虚拟主机的月流量表示什么
- 8debian 各个版本的代号
- 91.2 起步 - Git 简史
- 102021年熔化焊接与热切割复审考试及熔化焊接与热切割作业模拟考试
- 11linux-whereis 显示命令、源码、说明文档等全路径
- 12servet基础入门
- 13利用QSS和CDLinux破解路由密码
- 14三个OpenStack自动化部署工具:Devstack,OSA,Kolla对比
- 15office2019 专业增强版和激活下载,开发必备
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有