这仅仅只是一个小小的相册管理,主要实现的功能:能够实现对图片的上传,统一浏览,单个下载,单个删除,只能删除自己上传的文件。
现在对每个功能进行单个的解释:
图片的上传
图片的上传在之前的文章中写的很清楚了,点击打开链接:《JavaEE实现前后台交互的文件上传与下载》 。
在这个相册管理中,就不是单一的文件传了,还需要涉及到很多参数供其他功能模块的使用
//上传文件一般采用外面的 apache的上传工具包
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(" A Servlet ");
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=""+relName+" "+dt+" "+" ";
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实现相册管理的简单功能》
正在处于学习中,刚学到这个知识点,技术可能很落后了,但也愿意分享给大家,大家共同进步。
Java相关栏目本月热门文章
- 1【Linux驱动开发】设备树详解(二)设备树语法详解
- 2别跟客户扯细节
- 3Springboot+RabbitMQ+ACK机制(生产方确认(全局、局部)、消费方确认)、知识盲区
- 4【Java】对象处理流(ObjectOutputStream和ObjectInputStream)
- 5【分页】常见两种SpringBoot项目中分页技巧
- 6一文带你搞懂OAuth2.0
- 7我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:虚拟机与Java虚拟机介绍
- 8【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成
- 9JavaSE - 封装、static成员和内部类
- 10树莓派mjpg-streamer实现监控及拍照功能调试
- 11用c++写一个蓝屏代码
- 12从JDK8源码中看ArrayList和LinkedList的区别
- 13idea 1、报错java: 找不到符号 符号: 变量 log 2、转换成Maven项目
- 14在openwrt使用C语言增加ubus接口(包含C uci操作)
- 15Spring 解决循环依赖
- 16SpringMVC——基于MVC架构的Spring框架
- 17Andy‘s First Dictionary C++ STL set应用
- 18动态内存管理
- 19我的创作纪念日
- 20Docker自定义镜像-Dockerfile
热门相关搜索
路由器设置
木托盘
宝塔面板
儿童python教程
心情低落
朋友圈
vim
双一流学科
专升本
我的学校
日记学校
西点培训学校
汽修学校
情书
化妆学校
塔沟武校
异形模板
西南大学排名
最精辟人生短句
6步教你追回被骗的钱
南昌大学排名
清朝十二帝
北京印刷学院排名
北方工业大学排名
北京航空航天大学排名
首都经济贸易大学排名
中国传媒大学排名
首都师范大学排名
中国地质大学(北京)排名
北京信息科技大学排名
中央民族大学排名
北京舞蹈学院排名
北京电影学院排名
中国戏曲学院排名
河北政法职业学院排名
河北经贸大学排名
天津中德应用技术大学排名
天津医学高等专科学校排名
天津美术学院排名
天津音乐学院排名
天津工业大学排名
北京工业大学耿丹学院排名
北京警察学院排名
天津科技大学排名
北京邮电大学(宏福校区)排名
北京网络职业学院排名
北京大学医学部排名
河北科技大学排名
河北地质大学排名
河北体育学院排名



