动手写一个java版简单云相册,实现的功能是:
用户可以一次上传一个至多个文件。
用户可以下载其他人上传的图片。
用户可以查看其他所有人的图片。
用户只能删除通过自己IP上传的图片。
用到的技术:
文件上传下载、设计模式、Dom4j、xPath等。
先看下2个页面:
源代码:
web.xml:
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
37
38
39
40
41
42
43
44
45
46
|
<? xml version = "1.0" encoding = "UTF-8" ?> < web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> < display-name ></ display-name > < servlet > < servlet-name >UploadServlet</ servlet-name > < servlet-class >cn.hncu.servlets.UploadServlet</ servlet-class > </ servlet > < servlet > < servlet-name >cloudPhotoServlet</ servlet-name > < servlet-class >cn.hncu.servlets.cloudPhotoServlet</ servlet-class > </ servlet > < servlet > < servlet-name >DownServlet</ servlet-name > < servlet-class >cn.hncu.servlets.DownServlet</ servlet-class > </ servlet > < servlet > < servlet-name >DelServlet</ servlet-name > < servlet-class >cn.hncu.servlets.DelServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >UploadServlet</ servlet-name > < url-pattern >/upload</ url-pattern > </ servlet-mapping > < servlet-mapping > < servlet-name >cloudPhotoServlet</ servlet-name > < url-pattern >/cloudPhoto</ url-pattern > </ servlet-mapping > < servlet-mapping > < servlet-name >DownServlet</ servlet-name > < url-pattern >/servlet/DownServlet</ url-pattern > </ servlet-mapping > < servlet-mapping > < servlet-name >DelServlet</ servlet-name > < url-pattern >/servlet/DelServlet</ url-pattern > </ servlet-mapping > < welcome-file-list > < welcome-file >index.jsp</ welcome-file > </ welcome-file-list > </ web-app > |
index.jsp:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < html > < head > < title >chx云相册</ title > < script type = "text/javascript" > function delFile(input){ table = input.parentElement.parentElement.parentElement;//table.nodeName TBODY table.removeChild(input.parentElement.parentElement); } var t=1; function addFile(input){ tr = input.parentElement.parentElement; //alert(tr.nodeName); var str = "< td >选择文件:</ td >"+ "< td > < input type = 'file' name = 'file"+t+"' > </ td > "+ "< td >文件说明:</ td >"+ "< td > < input type = 'text' name = 'text"+t+"' > </ td > "+ "< td > < input type = 'button' value = '删除文件' onclick = 'delFile(this)' > </ td >"; tr.insertAdjacentHTML("beforeBegin",str); } function move(){ window.location.href="/myPhoto/cloudPhoto"; } </ script > < style type = "text/css" > #font{ color:red; } </ style > </ head > < body > < h1 >< font id = "font" >相册上传:</ font ></ h1 > < form action = "/myPhoto/upload" method = "post" enctype = "multipart/form-data" > < table border = "1px;double;#ff0000" > < tr > < td >选择文件:</ td > < td > < input type = "file" name = "file1" > </ td > < td >文件说明:</ td > < td > < input type = "text" name = "text1" > </ td > < td > < input type = "button" value = "删 除 文 件" onclick = "delFile(this)" > </ td > </ tr > < tr > < td colspan = 2 > < input type = "submit" value = "上 传 文 件" > </ td > < td colspan = 3 > < input type = "button" value = "添 加 文 件" onclick = "addFile(this)" > </ td > </ tr > </ table > </ form > < form action = "/myPhoto/cloudPhoto" method = "post" enctype = "multipart/form-data" > < table border = "1px;double;#ff0000" > < tr > < td colspan = 5 >< input type = "submit" value = "进 入 云 相 册" onclick = "move()" ></ td > </ tr > </ table > </ form > </ body > </ html > |
photo.xml:
1
2
3
4
|
<? xml version = "1.0" encoding = "UTF-8" ?> < photos > </ photos > |
MyUtils.java:
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
|
package cn.hncu.utils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; public class MyUtils { /** * @return 获取UUID */ public static String getUUID(){ return UUID.randomUUID().toString().replace( "-" , "" ); } /** * @param uuid * @return 通过uuid,获得打散后的路径 */ public static String getDir(String uuid){ String dir1 = Integer.toHexString( uuid.hashCode() & 0xf ); String dir2 = Integer.toHexString( (uuid.hashCode() & 0xf0 )>> 4 ); return "/" +dir1+ "/" +dir2; } //日期时间格式 private static SimpleDateFormat sdf = new SimpleDateFormat( "yyyy年MM月dd日 HH:mm:ss" ); /** * @return 返回的是上传的时候的日期时间 */ public static String getCurrentDateTime(){ return sdf.format( new Date()); } } |
Dom4jFactory.java:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
package cn.hncu.utils; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Dom4jFactory { private static Document dom= null ; private static String path; //静态块!只会运行一次!特点是在类加载的时候就执行 static { try { SAXReader sax = new SAXReader(); //因为我们的资源已经从myelipse中发布到tomcat服务器中了,所以跟原来的纯Java项目不一样了。 //利用当前类找到它的类加载器,然后通过该类加载器再去获得资源路径 path = Dom4jFactory. class .getClassLoader().getResource( "photo.xml" ).getPath(); //getClassLoader()返回:加载此对象所表示的类或接口的类加载器 //public URL getResource(String name)返回:读取资源的 URL 对象;如果找不到该资源,或者调用者没有足够的权限获取该资源,则返回 null。 //此方法首先搜索资源的父类加载器;如果父类加载器为 null,则搜索的路径就是虚拟机的内置类加载器的路径。 //public String getPath()获取此 URL 的路径部分。 System.out.println(path); dom = sax.read( new FileInputStream(path)); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (DocumentException e) { throw new RuntimeException(e); } } /** * @return 获取相册的Document */ public static Document getDocument(){ return dom; } /** * 进行photo.xml的保存,保存到本地 */ public static boolean save(){ try { XMLWriter w = new XMLWriter( new FileOutputStream(path)); w.write(dom); w.close(); return true ; } catch (UnsupportedEncodingException e) { return false ; } catch (FileNotFoundException e) { return false ; } catch (IOException e) { return false ; } } public static boolean del(String uuid){ Node node = dom.selectSingleNode( "[@uuid='" +uuid+ "']" ); if (node== null ){ return false ; } node.getParent().remove(node); return true ; } /** * 测试用 * @param args */ public static void main(String[] args){ System.out.println( getDocument() ); } } |
PhotoModel.java-值对象
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
package cn.hncu.domain; /** * 值对象封装 * @author 陈浩翔 * 2016-7-24 */ public class PhotoModel { private String uuid; //uuid private String realName= "" ; //图片真实文件名(上传时的文件名) private String ext; //后缀名 private String dir; //打散后的路径 private String dateTime; //上传文件的时间 private String ip; //上传者的IP private String desc; //文件的说明 public String getUuid() { return uuid; } public void setUuid(String uuid) { this .uuid = uuid; } public String getRealName() { return realName; } public void setRealName(String realName) { this .realName = realName; } public String getExt() { return ext; } public void setExt(String ext) { this .ext = ext; } public String getDir() { return dir; } public void setDir(String dir) { this .dir = dir; } public String getDateTime() { return dateTime; } public void setDateTime(String dateTime) { this .dateTime = dateTime; } public String getIp() { return ip; } public void setIp(String ip) { this .ip = ip; } public String getDesc() { return desc; } public void setDesc(String desc) { this .desc = desc; } @Override public String toString() { return "PhotoModel [uuid=" + uuid + ", realName=" + realName + ", ext=" + ext + ", dir=" + dir + ", dateTime=" + dateTime + ", ip=" + ip + ", desc=" + desc + "]" ; } } |
PhotoDao.java:
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
37
|
package cn.hncu.photoDao.Dao; import java.util.List; import cn.hncu.domain.PhotoModel; public interface PhotoDao { /** * @param photo * @return 数据的保存 */ public boolean save(PhotoModel photo); /** * @return 返回所所有的图片信息 */ public List<PhotoModel> getAll(); /** * @param uuid * @return 通过uuid 查找那个被封装的值对象 */ public PhotoModel getSingleByUuid(String uuid); /** * @param uuid * @return 通过uuid删除photos.xml中该图片的信息 */ public boolean deleteXml(String uuid); /** * @param dir * @return 通过路径删除服务器磁盘中该图片的信息 */ public boolean deleteFile(String pathFileName); } |
PhotoSerImpl.java:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
package cn.hncu.photoDao.impl; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import cn.hncu.domain.PhotoModel; import cn.hncu.photoDao.Dao.PhotoDao; import cn.hncu.utils.Dom4jFactory; public class PhotoSerImpl implements PhotoDao{ @Override public boolean save(PhotoModel photo) { Document dom = Dom4jFactory.getDocument(); Element root = dom.getRootElement(); //添加属性 Element p = root.addElement( "photo" ); p.addAttribute( "uuid" , photo.getUuid()); p.addAttribute( "realName" , photo.getRealName()); p.addAttribute( "dateTime" , photo.getDateTime()); p.addAttribute( "ip" , photo.getIp()); p.addAttribute( "ext" , photo.getExt()); p.addAttribute( "dir" , photo.getDir()); p.addAttribute( "desc" , photo.getDesc()); return Dom4jFactory.save(); } @Override public List<PhotoModel> getAll() { List<PhotoModel> list = new ArrayList<PhotoModel>(); Document dom = Dom4jFactory.getDocument(); Element root = dom.getRootElement(); Iterator<Element> it = root.elementIterator( "photo" ); //通过DOM4J获得photo元素的迭代器,也可以通过xPath来找到所有的 photo //List<Node> lists = dom.selectNodes("//photo[@uuid]"); //Iterator<Node> it = lists.iterator(); while (it.hasNext()){ Element e = it.next(); PhotoModel photo = new PhotoModel(); photo.setUuid(e.attributeValue( "uuid" )); photo.setRealName(e.attributeValue( "realName" )); photo.setDateTime(e.attributeValue( "dateTime" )); photo.setExt(e.attributeValue( "ext" )); photo.setIp(e.attributeValue( "ip" )); photo.setDir(e.attributeValue( "dir" )); photo.setDesc(e.attributeValue( "desc" )); list.add(photo); } return list; } @Override public PhotoModel getSingleByUuid(String uuid) { List<PhotoModel> photos=getAll(); for (PhotoModel photo:photos){ if (photo.getUuid().equals(uuid)){ return photo; } } return null ; } @Override public boolean deleteXml(String uuid) { Document dom = Dom4jFactory.getDocument(); Element e = (Element) dom.selectSingleNode( "//photo[@uuid='" +uuid.trim()+ "']" ); return e.getParent().remove(e); } @Override public boolean deleteFile(String pathFileName) { try { File file = new File(pathFileName); if (file.exists()){ file.delete(); } return true ; } catch (Exception e) { return false ; } } } |
PhotoDaoFactory.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package cn.hncu.photoDao.factory; import cn.hncu.photoDao.impl.PhotoSerImpl; /** * 工厂方法 * @author 陈浩翔 * 2016-7-24 */ public class PhotoDaoFactory { public static PhotoSerImpl getPhotoDao(){ return new PhotoSerImpl(); } } |
上传-UploadServlet.java:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
package cn.hncu.servlets; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import cn.hncu.domain.PhotoModel; import cn.hncu.photoDao.Dao.PhotoDao; import cn.hncu.photoDao.factory.PhotoDaoFactory; import cn.hncu.utils.Dom4jFactory; import cn.hncu.utils.MyUtils; public class UploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html;charset=utf-8" ); response.getWriter().print( "<h1>很抱歉,本页面不支持GET方式访问!!!</h1>" ); response.getWriter().print( "<a href='javascript:history.go(-1)'>返回上一页</a> " ); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html;charset=utf-8" ); final PrintWriter out = response.getWriter(); //防黑-非multipart表单提交 //使用上传工具的方式 boolean boo = ServletFileUpload.isMultipartContent(request); if (!boo){ out.print( "<h1>不支持普通表单的提交方式!</h1>" ); return ; } File file = new File( "d:/photoCache" ); if (!file.exists()){ file.mkdir(); } DiskFileItemFactory fiFactory = new DiskFileItemFactory( 1024 * 10 ,file); ServletFileUpload upload = new ServletFileUpload(fiFactory); upload.setHeaderEncoding( "utf-8" ); //设置文件名编码 String path = getServletContext().getRealPath( "/photos" ); FileItem fi = null ; try { List<FileItem> list = upload.parseRequest(request); PhotoModel photo = new PhotoModel(); //数据封装---需要7个属性 photo.setRealName( "" ); int cont= 0 ; for (FileItem f:list){ if (cont!= 0 && cont% 2 == 0 && !photo.getRealName().equals( "" )){ photo = new PhotoModel(); //重新数据封装 } fi=f; if (fi.isFormField()){ //普通表单组件 //得到文件说明 String desc = fi.getString( "utf-8" ); photo.setDesc(desc); //#1 } else { //防黑3-如果在file组件中不选择文件 if (fi.getSize()== 0 ){ photo.setRealName( "" ); cont++; continue ; } String fileName = fi.getName(); fileName = fileName.substring( fileName.lastIndexOf( "\\" )+ 1 ); //真实文件名 photo.setRealName(fileName); //#2 String ext = fileName.substring(fileName.lastIndexOf( "." )); //扩展名 photo.setExt(ext); //#3 photo.setDateTime(MyUtils.getCurrentDateTime()); //#4 photo.setIp( request.getRemoteAddr() ); //#5 String uuid = MyUtils.getUUID(); photo.setUuid(uuid); //#6 photo.setDir( MyUtils.getDir(uuid) ); //#7 //打散目录 File dFile = new File(path+photo.getDir()); if (!dFile.exists()){ dFile.mkdirs(); } fi.write( new File(path+photo.getDir()+ "/" +photo.getUuid()+photo.getExt())); } cont++; if (cont% 2 == 0 && !photo.getRealName().equals( "" )){ PhotoDao dao = PhotoDaoFactory.getPhotoDao(); boo = dao.save(photo); //存入磁盘-法二:FileUtils.copyInputStreamToFile(in, new File(fileName2));//※2※ 把图片文件存储到服务器硬盘 photo = new PhotoModel(); //重新数据封装 } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (fi!= null ){ fi.delete(); } if (Dom4jFactory.save()){ out.print( "<h1>上传成功!</h1>" ); out.print( "<a href='javascript:history.go(-1)'>返回上一页</a> " ); } else { out.print( "<h1>上传失败!</h1>" ); out.print( "<a href='javascript:history.go(-1)'>返回上一页</a> " ); } } } } |
显示所有文件-cloudPhotoServlet.java
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
package cn.hncu.servlets; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.hncu.domain.PhotoModel; import cn.hncu.photoDao.Dao.PhotoDao; import cn.hncu.photoDao.factory.PhotoDaoFactory; public class cloudPhotoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pwd = (String) request.getParameter( "pwd" ); if ( "chx" .equals(pwd)) { doPost(request, response); } else { response.setContentType( "text/html;charset=utf-8" ); response.getWriter().print( "<h1>很抱歉,你没有权限访问!!!</h1>" ); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html;charset=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>CHX云相册</TITLE></HEAD>" ); out.println( " <BODY>" ); out.println( "<table border='1px;double;#ff0000'>" ); out.println( "<tr>" ); out.println( "<td>文件名</td>" ); out.println( "<td>上传时间" ); out.println( "<td>文件</td>" ); out.println( "<td>文件说明</td>" ); out.println( "<td>操作</td> " ); out.println( "</tr>" ); String tdWH = "style='width:200px; height:200px;'" ; // 显示所有图片 PhotoDao dao = PhotoDaoFactory.getPhotoDao(); List<PhotoModel> photos = dao.getAll(); for (PhotoModel photo : photos) { String fileName = photo.getRealName(); String time = photo.getDateTime(); // 输出图片 String path = request.getContextPath() + "/photos/" + photo.getDir() + "/" + photo.getUuid() + photo.getExt(); // System.out.println(path); // /myPhoto/photos//7/c/a1237a48a6aa451cb22fa78b15bafcea.jpg String img = "<a href='" + path + "'><img src='" + path + "'/></a>" ; String desc = photo.getDesc(); String delStr = "<a href='/myPhoto/servlet/DelServlet?uuid=" + photo.getUuid() + "'>删除</a>" ; String downStr = "<a href='/myPhoto/servlet/DownServlet?uuid=" + photo.getUuid() + "'>下载</a>" ; out.println( "<tr>" ); out.println( "<td " + tdWH + "> " + fileName + " </td>" ); out.println( "<td " + tdWH + ">" + time + "</td>" ); out.println( "<td " + tdWH + ">" + img + "</td>" ); out.println( "<td " + tdWH + ">" + desc + "</td>" ); out.println( "<td " + tdWH + ">" + delStr + " " + downStr + "</td>" ); out.println( "</tr>" ); } out.println( "<tr>" ); out.println( "</tr>" ); out.println( "</table>" ); out.println( " </BODY>" ); out.println( "</HTML>" ); out.flush(); out.close(); } } |
删除文件-DelServlet.java
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
package cn.hncu.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.hncu.domain.PhotoModel; import cn.hncu.photoDao.Dao.PhotoDao; import cn.hncu.photoDao.factory.PhotoDaoFactory; public class DelServlet extends HttpServlet { //注入 private PhotoDao dao = PhotoDaoFactory.getPhotoDao(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uuid = request.getParameter( "uuid" ); String ip = request.getRemoteAddr(); response.setContentType( "text/html;charset=utf-8" ); PrintWriter out = response.getWriter(); PhotoModel photo = dao.getSingleByUuid(uuid); if (photo!= null ){ if (!photo.getIp().equals(ip)){ out.print( "<h1>你没有权限删除这个文件!!!</h1>" ); out.print( "<a href='javascript:history.go(-1)'>返回上一页</a> " ); return ; } //1.删除数据库中的信息 boolean boo = dao.deleteXml(uuid); if (boo){ String fileName = "photos/" +photo.getDir()+ "/" +photo.getUuid()+photo.getExt(); String pathFileName = getServletContext().getRealPath(fileName); if (dao.deleteFile(pathFileName)){ //重定向到相册页面 response.sendRedirect( "/myPhoto/cloudPhoto?pwd=chx" ); } else { out.print( "<h1>无法从服务器中删除,文件正在被占用!!!</h1>" ); out.print( "<a href='javascript:history.go(-1)'>返回上一页</a> " ); } } else { out.print( "<h1>该文件已经不存在!!!</h1>" ); out.print( "<a href='javascript:history.go(-1)'>返回上一页</a> " ); } } } } |
下载文件-DownServlet.java
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package cn.hncu.servlets; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.hncu.domain.PhotoModel; import cn.hncu.photoDao.Dao.PhotoDao; import cn.hncu.photoDao.factory.PhotoDaoFactory; public class DownServlet extends HttpServlet { private PhotoDao dao = PhotoDaoFactory.getPhotoDao(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uuid = request.getParameter( "uuid" ); System.out.println(uuid); PhotoModel photo = dao.getSingleByUuid(uuid); System.out.println(photo); if (photo!= null ){ //设置响应头--内容接收程序--浏览器看到这个响应头,就会把它认为的下载程序打开 //(如果识别迅雷那么就会自动打开迅雷,如果没有则会打开一个“文件另存为”的对话框) response.setContentType( "application/force-download" ); String realName = photo.getRealName(); String agent = request.getHeader( "User-Agent" ); System.out.println(agent); if (agent.indexOf( "Mozilla" )!=- 1 ){ //火狐浏览器 response.setHeader( "Content-Disposition" , "attachment;filename=" + new String(realName.getBytes( "GB2312" ), "ISO-8859-1" )); } else { //解决中文乱码问题(只要用下面一句对文件名进行编码就行了) realName = URLEncoder.encode(realName, "utf-8" ); //使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。 response.setHeader( "Content-Disposition" , "attachment;filename=\"" +realName+ "\"" ); //注意:“cttachment;”不能少,否则浏览器会直接在新窗口中打开 } String fileName = "photos/" + photo.getDir()+ "/" +photo.getUuid()+photo.getExt(); String pathFileName = getServletContext().getRealPath(fileName); InputStream in = new FileInputStream(pathFileName); OutputStream out = response.getOutputStream(); byte buf[] = new byte [ 2048 ]; int len= 0 ; while ( (len=in.read(buf))!=- 1 ){ out.write(buf, 0 , len); } out.close(); in.close(); } else { response.setContentType( "text/html;charset=utf-8" ); response.getWriter().println( "<h1>该文件已经被删除了</h1>" ); } } } |
演示结果
这个我就不演示啦,图片在前面也有,所有的源码我都给了。有兴趣的可以自己取改进一下咯。
其实这个还能上传其他任意类型文件哦,因为我们没有防护后缀名的,而且我们是用字符流传输,全都不会失真(可以当云盘来处理了~~)!!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/qq_26525215/article/details/52012685