这仅仅只是一个小小的相册管理,主要实现的功能:能够实现对图片的上传,统一浏览,单个下载,单个删除,只能删除自己上传的文件。
现在对每个功能进行单个的解释:
图片的上传
图片的上传在之前的文章中写的很清楚了,点击打开链接:《JavaEE实现前后台交互的文件上传与下载》 。
在这个相册管理中,就不是单一的文件传了,还需要涉及到很多参数供其他功能模块的使用
1
2
3
4
5
6
7
8
9
10
11
|
<span style= "font-size:24px;" > //上传文件一般采用外面的 apache的上传工具包
/*
* 我们需要将上传的文件放到指定的文件夹下
* 要获得文件的信息 文件名 要存储的文件夹(打散) uuid--dir
* 解决中文问题存储的文件名 uuid.jpg
* 每个人都有自己的权限 ip
* 上传的时间 dt
* 文件原先的真是名字 relName
* 相片的说明 desc
* 文件的扩展名 ext
*上面上传一个图片需要这么多的信息,,所以 采用 值对象《VO》封装采用打乱文件夹存储,让性能更优。</span>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<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>
|
1
|
<span style= "font-size:24px;" > //前面的都是和之前的那个说的差不多,具体的统计参数就是从这里开始。</span>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<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文件中,还需要将图片存储起来。等浏览的时候统一查看。
效果图:
统一浏览
浏览基本就是全部将xml文件里面的数据,读出来,然后统一读出来显示。封装在一个list中,将所有的photo数据封装在list集合中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//查询所有的对象然后封装成一个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);
- }
效果:
单个下载
下载在之前的上传和下载中都说的很清楚了,点击打开链接: 《JavaEE实现前后台交互的文件上传与下载》。
下载的代码中需要注意:需要设置相应头和文件名的传输
下面是具体的代码:
- 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这样才能让删除的时候用权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
//删除照片
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;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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实现相册管理的简单功能》
正在处于学习中,刚学到这个知识点,技术可能很落后了,但也愿意分享给大家,大家共同进步。