功能文件的上传,下载和管理
技术:1.用xml当做数据库存储信息(dom4j,xpath)
2.Java表单的文件上传和下载
3.文件目录的打散 ( Hash目录是一种优化文件存储性能的方法)
需要的jar包:
commons-fileupload-1.2.2.jar、commons-io-2.1.jar、dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar
--------------------------------------------------------------------------------
先写index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html >
< head >
< title >相册管理系统</ title >
</ head >
< body >
< h1 >我的小相册</ h1 >
< a href = "jsps/upload.jsp" >上传相册</ a >
< a href = "servlets/ShowServlet" >浏览相册</ a >
</ body >
</ html >
|
upload.jsp是下载页面放在jsps目录下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html >
< head >
</ head >
< body >
< h1 >相处上传</ h1 >
< form action="<%=request.getContextPath()%>/servlets/UploadServlet"
method="post" enctype="multipart/form-data">
文件:< input type = "file" name = "file1" />< br />
说明:< input type = "text" name = "desc" />< br />
< input type = "submit" value = "上传" />
</ form >
</ body >
</ html >
|
photos.xml放在src目录下
1
2
3
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< photos >
</ photos >
|
在写值对象PhotoModel
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
|
package cn.hncu.demain;
public class PhotoModel {
private String id;
private String realName;
private String ext;
private String dir;
private String dateTime;
private String ip;
private String desc;
public String getId() {
return id;
}
public void setId(String id) {
this .id = id;
}
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 [id=" + id + ", realName=" + realName + ", ext="
+ ext + ", dir=" + dir + ", dateTime=" + dateTime + ", ip="
+ ip + ", desc=" + desc + "]" ;
}
}
|
写工具类两个:
MyUtil(日期格式化,目录打散代码,随机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
|
package cn.hncu.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
public class MyUtils {
private MyUtils() {
}
private static SimpleDateFormat format= new SimpleDateFormat( "yyyy年MM月dd日 hh:mm:ss" );
public static String getCurrentDateTime(){
return format.format( new Date());
}
public static String getUUid(){
UUID uuid=UUID.randomUUID();
String id=uuid.toString().replaceAll( "-" , "" );
return id;
}
public static String getDir(String uuid){
String dir1=Integer.toHexString(uuid.hashCode() & 0xf );
String dir2=Integer.toHexString((uuid.hashCode() & 0xf0 )>> 4 );
return dir1+ "/" +dir2;
}
}
|
Dom4jFactory(dom4j的相关操作,获取document对象,保存操作)
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
|
package cn.hncu.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
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();
// 学习一下服务器下的资源路径加载方式(因为我们的资源已经从MyEclipse中发布到Tomcat服务器中了,所以跟原来纯Java项目不一样了)
// 利用当前类找到它的类加载器,然后通过该类加载器再去获得资源路径
path = Dom4jFactory. class .getClassLoader().getResource( "photos.xml" )
.getPath();
dom = sax.read( new FileInputStream(path));
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public static Document getDom(){
return dom;
}
public static boolean save(){
try {
OutputFormat format= new OutputFormat();
format.setEncoding( "utf-8" );
XMLWriter w = new XMLWriter( new FileOutputStream( new File(path)),format);
w.write(dom);
w.close();
return true ;
} catch (Exception e) {
return false ;
}
}
}
|
从底层写PhotoDao
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.dao;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import cn.hncu.demain.PhotoModel;
import cn.hncu.utils.Dom4jFactory;
public class PhotoDao {
//添加
public boolean add(PhotoModel photo){
Document dom=Dom4jFactory.getDom();
Element root=dom.getRootElement();
Element ePhoto=root.addElement( "photo" );
ePhoto.addAttribute( "id" , photo.getId());
ePhoto.addAttribute( "realName" , photo.getRealName());
ePhoto.addAttribute( "dir" , photo.getDir());
ePhoto.addAttribute( "ip" , photo.getIp());
ePhoto.addAttribute( "dateTime" , photo.getDateTime());
ePhoto.addAttribute( "ext" , photo.getExt());
ePhoto.addElement( "desc" ).setText(photo.getDesc());
boolean boo=Dom4jFactory.save();
return boo;
}
//浏览
public List<PhotoModel> getAll(){
Document dom=Dom4jFactory.getDom();
List<PhotoModel> list= new ArrayList<PhotoModel>();
Element root=dom.getRootElement();
Iterator<Element> it=root.elementIterator();
while (it.hasNext()){
PhotoModel photo= new PhotoModel();
Element e=it.next();
photo.setId(e.attributeValue( "id" ));
photo.setDateTime(e.attributeValue( "dateTime" ));
photo.setDir(e.attributeValue( "dir" ));
photo.setExt(e.attributeValue( "ext" ));
photo.setIp(e.attributeValue( "ip" ));
photo.setRealName(e.attributeValue( "realName" ));
photo.setDesc(e.elementText( "desc" ));
list.add(photo);
}
return list;
}
public PhotoModel getSingleById(String id) {
Document dom=Dom4jFactory.getDom();
List<PhotoModel> list=getAll();
for (PhotoModel photo:list){
if (photo.getId().equals(id)){
return photo;
}
}
return null ;
}
public boolean del(String id) {
Document dom=Dom4jFactory.getDom();
Element e=(Element) dom.selectSingleNode( "//photo[@id='" +id.trim()+ "']" );
return e.getParent().remove(e);
}
}
|
最后写四个servlet
UploadServlet 上传Servlet代码
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
|
package cn.hncu.servlets;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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 org.apache.commons.io.FileUtils;
import cn.hncu.dao.PhotoDao;
import cn.hncu.demain.PhotoModel;
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" );
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>" );
out.println( "不支持get方式上传!" );
out.println( " </BODY>" );
out.println( "</HTML>" );
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType( "text/html;charset=utf-8" );
PrintWriter out = response.getWriter();
String path=request.getServletContext().getRealPath( "/photos" );
DiskFileItemFactory factory= new DiskFileItemFactory();
factory.setRepository( new File( "g:/a" ));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax( 1024 * 1024 * 10 ); //最大10M
upload.setHeaderEncoding( "utf-8" ); //用于设置文件名的编码,相当于:request.setCharacterEncoding("utf-8");
FileItem fi= null ;
try {
List<FileItem> list=upload.parseRequest(request);
PhotoModel photo = new PhotoModel(); //数据封装---需要7个属性
boolean boo= false ;
InputStream in = null ;
for (FileItem fi2:list){
fi=fi2;
if (fi.isFormField()){
String desc=fi.getString( "utf-8" );
photo.setDesc(desc); //desc
} else {
in=fi.getInputStream();
String realName=fi.getName();
if (realName== null || realName.trim().equals( "" )){
out.print( "没有选择文件!" );
return ;
}
if (realName.indexOf( "\\" )!=- 1 ){
realName=realName.substring(realName.lastIndexOf( "\\" )+ 1 );
}
photo.setRealName(realName); //真实文件名
String ext=realName.substring(realName.lastIndexOf( "." ));
photo.setExt(ext); //3
photo.setDateTime(MyUtils.getCurrentDateTime()); //4
photo.setId(MyUtils.getUUid()); //5
photo.setDir(MyUtils.getDir(photo.getId())); //6
photo.setIp(request.getRemoteAddr()); //7
}
}
//把相片信息存储到数据库
PhotoDao dao= new PhotoDao();
boo=dao.add(photo);
//如果上面的相片信息保存成功,那么才开始接收图片文件,把它保存到服务器硬盘
if (boo){
System.out.println(dao);
path=path+ "/" +photo.getDir();
File dir= new File(path);
if (!dir.exists()){
dir.mkdirs();
}
String fileName=path+ "/" +photo.getId()+photo.getExt();
FileUtils.copyInputStreamToFile(in, new File(fileName));
String strPath = request.getContextPath()+ "/servlets/ShowServlet" ;
out.print( "上传成功!<a href='" +strPath+ "'>浏览相册</a>" );
} else {
out.print( "上传失败!" );
}
} catch (FileUploadException e) {
throw new RuntimeException( "上传失败!" , e);
} finally {
if (fi!= null ){
fi.delete();
}
}
out.flush();
out.close();
}
}
|
ShowServlet 浏览相册的Servlet端
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
|
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.dao.PhotoDao;
import cn.hncu.demain.PhotoModel;
public class ShowServlet extends HttpServlet {
IOException if an error occurred
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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>" );
String table= "<table border='1' width='100%'>" +
"<tr><th>文件名</th><th>上传ip</th><th>上传时间</th><th>图片</th><th>说明</th><th>操作</th></tr>"
;
out.print(table);
PhotoDao dao= new PhotoDao();
List<PhotoModel> list=dao.getAll();
for (PhotoModel p:list){
out.print( "<tr>" );
out.println( "<td>" +p.getRealName()+ "</td>" );
out.println( "<td>" +p.getIp()+ "</td>" );
out.println( "<td>" +p.getDateTime()+ "</td>" );
//输出图片
String path=request.getContextPath()+ "/photos/" +p.getDir()+ "/" +p.getId()+p.getExt();
out.println( "<td><a href='" +path+ "'><img src='" +path+ "' width='200' height='200'></img></a></td>" );
String op= "<a href='" +request.getContextPath()+ "/servlets/DelServlet?id=" +p.getId()+ "'>删除</a> " ;
out.println( "<td>" +p.getDesc()+ "</td>" );
op+= "<a href='" +request.getContextPath()+ "/servlets/DownServlet?id=" +p.getId()+ "'>下载</a>" ;
out.println( "<td>" +op+ "</td>" );
out.print( "</tr>" );
}
out.println( "</table>" );
out.println( " </BODY>" );
out.println( "</HTML>" );
out.flush();
out.close();
}
}
|
DownServlet 下载的服务器代码
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
|
package cn.hncu.servlets;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
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.dao.PhotoDao;
import cn.hncu.demain.PhotoModel;
public class DownServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id=request.getParameter( "id" );
response.setContentType( "application/force-download" );
PhotoModel p= new PhotoDao().getSingleById(id);
if (p!= null ){
String realName=p.getRealName();
realName= new String(realName.getBytes( "iso8859-1" ), "utf-8" );
response.setHeader( "content-Disposition" , "attachment;filename=\"" +realName+ "\"" );
String relpath=getServletContext().getRealPath( "/photos/" +p.getDir()+ "/" +p.getId()+p.getExt());
InputStream in= new FileInputStream(relpath);
OutputStream out=response.getOutputStream();
System.out.println(relpath);
byte buf[]= new byte [ 1024 ];
int len= 0 ;
while ((len=in.read(buf))!=- 1 ){
out.write(buf, 0 ,len);
}
out.close();
} else {
response.setContentType( "text/html;charset=utf-8" );
response.getWriter().println( "该文件已经被删除!" );
}
}
}
|
Delservlet 删除操作的服务器
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.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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.dao.PhotoDao;
import cn.hncu.demain.PhotoModel;
public class DelServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding( "utf-8" );
response.setContentType( "text/html;charset=utf-8" );
PrintWriter out=response.getWriter();
String id=request.getParameter( "id" );
PhotoModel p= new PhotoDao().getSingleById(id);
if (p!= null ){
if (!p.getIp().equals(request.getRemoteAddr())){
out.println( "你无权进行删除!" );
return ;
}
//※※※※以下部分课后补敲的!!!!
//1删除数据库中的信息
PhotoDao dao= new PhotoDao();
boolean boo=dao.del(id);
//2把服务器硬盘中的文件删除
if (boo){
String fileName= "photos/" +p.getDir()+ "/" +p.getId()+p.getExt();
String pathFileName = getServletContext().getRealPath(fileName);
File f= new File(pathFileName);
if (f.exists()){
f.delete();
}
String strPath = request.getContextPath()+ "/servlets/ShowServlet" ;
out.println( "相片删除成功!<a href='" +strPath+ "'>浏览相册</a>" );
} else {
out.println( "相片删除失败!" );
}
} else {
response.setContentType( "text/html;charset=utf-8" );
response.getWriter().println( "该文件不存在!" );
}
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。