package
com
.
wk
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.util.Iterator
;
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.FileUploadBase.SizeLimitExceededException
;
import
org.apache.commons.fileupload.disk.DiskFileItemFactory
;
import
org.apache.commons.fileupload.servlet.ServletFileUpload
;
public
class
fileUploadServlet
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
{
response
.
setContentType
(
"text/html"
);
PrintWriter
out
=
response
.
getWriter
();
final
long
MAX_SIZE
=
300
*
1024
*
1024
;
//设置上传文件最大值
final
String
[]
allowedExt
=
new
String
[]
{
"jpg"
,
"bmp"
,
"gif"
};
//允许上传的文件格式列表
DiskFileItemFactory
dfif
=
new
DiskFileItemFactory
();
//实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
dfif
.
setSizeThreshold
(
4096
);
//设置上传文件适用于临时存放文件的内存大小,这里是4K,多余的部分将临时存在硬盘
dfif
.
setRepository
(
new
File
(
request
.
getRealPath
(
"/"
)+
"uploadFiles"
));
ServletFileUpload
sfu
=
new
ServletFileUpload
(
dfif
);
//用以上工厂实例化上传组件
sfu
.
setSizeMax
(
5
*
1024
*
1024
);
//设置最大上传大小
List
fileList
=
null
;
//从list得到所有上传域的列表
try
{
fileList
=
sfu
.
parseRequest
(
request
);
}
catch
(
FileUploadException
e
){
//处理文件尺寸过大异常
if
(
e
instanceof
SizeLimitExceededException
){
out
.
println
(
"文件尺寸超过规定大小:"
+
MAX_SIZE
+
"字节<p/>"
);
out
.
println
(
"<a href=\"index.jsp\" target=\"_top\">返回</a>"
);
return
;
}
return
;
}
Iterator
fileItr
=
fileList
.
iterator
();
//得到所有上传的文件
while
(
fileItr
.
hasNext
()){
//循环处理所有文件
FileItem
fileItem
=
null
;
String
path
=
null
;
long
size
=
0
;
fileItem
=
(
FileItem
)
fileItr
.
next
();
//得到当前文件
if
(
fileItem
==
null
||
fileItem
.
isFormField
()){
//忽略见到form字段,如<input type='text'>
continue
;
}
path
=
fileItem
.
getName
();
//得到文件的完整路径
size
=
fileItem
.
getSize
();
//得到文件大小
if
(
""
.
equals
(
path
)||
size
==
0
){
out
.
println
(
"请选择上传文件<p/>"
);
out
.
println
(
"<a href='index.jsp'>返回</a>"
);
return
;
}
String
t_name
=
path
.
substring
(
path
.
lastIndexOf
(
"\\"
)+
1
);
//得到取出路径的文件名
String
t_ext
=
t_name
.
substring
(
t_name
.
lastIndexOf
(
"."
)+
1
);
//得到文件的扩展名(无扩展名是将得到全名)
int
allowFlag
=
0
;
//拒绝接受规定文件格式外的文件类型
int
allowedExtCount
=
allowedExt
.
length
;
//规定的文件类型的个数
for
(;
allowFlag
<
allowedExtCount
;
allowFlag
++){
if
(
allowedExt
[
allowFlag
].
equals
(
t_ext
))
break
;
}
if
(
allowFlag
==
allowedExtCount
){
//文件类型不符和规定
out
.
println
(
"请上传一下类型的文件<p/>"
);
for
(
allowFlag
=
0
;
allowFlag
<
allowedExtCount
;
allowFlag
++){
out
.
println
(
"*."
+
allowedExt
[
allowFlag
]+
" "
);
out
.
println
(
"<p/><a href=\"index.jsp\">返回</a>"
);
return
;
}
long
now
=
System
.
currentTimeMillis
();
//根据系统时间生成上传后保存的文件名
String
prefix
=
String
.
valueOf
(
now
);
String
filename
=
prefix
+
","
+
t_ext
;
try
{
fileItem
.
write
(
new
File
(
request
.
getRealPath
(
"/"
)+
"uploadFiles"
));
System
.
out
.
println
(
"OK"
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
}
}
}