欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-08 08:10:09
这仅仅只是一个小小的相册管理,主要实现的功能:能够实现对图片的上传,统一浏览,单个下载,单个删除,只能删除自己上传的文件。 现在对每个功能进行单个的解释: 图片的上传&...

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

<span style="font-size:24px;">//上传文件一般采用外面的 apache的上传工具包 
 /* 
 * 我们需要将上传的文件放到指定的文件夹下 
 * 要获得文件的信息 文件名 要存储的文件夹(打散) uuid--dir 
 * 解决中文问题存储的文件名 uuid.jpg 
 * 每个人都有自己的权限 ip 
 * 上传的时间  dt 
 * 文件原先的真是名字 relname 
 * 相片的说明 desc 
 * 文件的扩展名 ext 
 *上面上传一个图片需要这么多的信息,,所以 采用 值对象《vo》封装采用打乱文件夹存储,让性能更优。</span> 
<span style="font-size:24px;"> */ 
 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<fileitem> list=sf.parserequest(request); 
 for(fileitem ff:list){</span> 

<span style="font-size:24px;">//前面的都是和之前的那个说的差不多,具体的统计参数就是从这里开始。</span> 

<span style="font-size:24px;"> 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();//删除临时文件 
 } 
 }</span> 

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

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

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

//查询所有的对象然后封装成一个list对象返回给前端 
 public static list<photo> getall(){ 
 
 list<photo> list=new arraylist<photo>(); 
 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("<!doctype html public \"-//w3c//dtd html 4.01 transitional//en\">"); 
 out.println("<html>"); 
 out.println(" <head><title>a servlet</title></head>"); 
 out.println(" <body>"); 
 list<photo> 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 = "<table border=1px width='80%'><tr><th>相册名</th><th>时间</th><th>图片显示</th><th>操作</th>"; 
 out.write(str); 
 for(photo p:list){ 
 relname=p.getrelname(); 
 dt=p.getdt(); 
 imgs=path+"/upfile/"+p.getdir()+"/"+p.getid()+p.getext();//完成的文件路径加文件名 
 
 ss="<tr><td>"+relname+"</td><td>"+dt+"</td><td>"+"<a href='"+imgs+"'><img style='border:0px' width='100' height='100' src='"+imgs+"' alt='图片'/></a></td>"; 
 tt="<td><a href='downfile?id="+p.getid()+"'>下载</a> <a href='mydelelte?id="+p.getid()+"'>删除图片</a>"+"</td></tr>";//通过id来区分他们直接的区别 可以进行删除和下载 
 out.write(ss); 
 out.write(tt); 
 } 

效果:

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

单个下载
下载在之前的上传和下载中都说的很清楚了,点击打开链接: 《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("文件不存在无法下载"); 
 } 
 } 

效果图:

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

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

//删除照片 
public static map<string , object> deletebyid(string ip,string id) { 
 map<string, object> map =new hashmap<string, object>(); 
 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<string, object> 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实现相册管理的简单功能》

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