文件上传
一、文件上传表单跟普通表单的区别
- 属性:文件上传表单需要加上ecntype=“mutlipart/from-data”,普通表单不需要指定ecntype属性;
- 请求方式:文件上传表单只能通过post提交表单,而普通表单可以post或get方法
- 提交:提交文件上传表单时,每个表单项都有自己独立的头信息;而普通表单项的头信息都是相同的;
- 获取:文件上传表单:不能通过request,getParameter方法获取表单数据,只能通过getinputStream获取表单。
二、操作步骤:
-
导入upload的相关jar包
common-upload—.jar
common-io—.jar
-
创建DiskfileitemFactory对象,该对象用于创建fileitem
-
创建ServletUpload对象解析器,该对象用于解析request请求
-
调用ServletUpload对象的parseRequest()方法解析request请求
-
解析产生的fileitem是一个list集合,遍历集合
-
遍历集合后就判断结果是否为普通表单,用isformfield()方法判断
若为普通表单,则直接用fileitem.getString(“utf-8”)输出。
-
若不是普通表单,判断是否是图片,isvalid(fileitem)true为是图片
if(!isvalid(fileitem)){ request.setAttribute( “提示的地方”,“只能上传图片” );
request.getRequestDispatcher("/uoload.jsp").forward(request,respone); return;//结束当前方法的执行}
还可以判断大小……(可以通过servletFileUpload对象的setFileSizeMax方法,指定上传文件的大小…)
-
是图片,InputStream inputstream = fileitem.getInputStream();//获取上传文件的输入流
String name=fileitem.getName();//得到图片的名字
//定义保存图片的路径( getservletcontext.getrealpath得到真实路径,即当前项目的发布路径)
String uploadPath = request.getServletContext.getRealPath("/WEB-INF/upload");
//创建FileoutputStream对象,并读取图片数据,写入for输出流中
FileoutputStream fos = new FileoutputStream(uploadPath+"/"+name);
//创建一个缓冲区
Byte[] buf = new Byte[1024];
int len = inputstream.read(buf);//读取一定数量的字节,将其存储在缓冲区buf中
while(len !=-1){ 当inputstream读到文件末尾而没有可用字节,则返回值-1
fos.write(buf,0,len);//将从buf数组中从0开始的len个字节写入此输出流
len = inputStream.read(buf);//继续读取,将其存储在缓冲区buf中
}
//关闭资源
fos.close( );
##isvalid()方法:
/**
- 判断FileItem文件表单项是否是图片,如果是就返回true,否则返回false。
- @param fi
- @return
*/
public boolean isValid(FileItem fi) {
String contentType = fi.getContentType(); //例如:image/jpeg
String regex = “image/[a-zA-Z]{3,4}”; //验证图片的正则
return contentType.matches(regex);
}
过滤器
servlet的三大组件之一。如果配置过滤器,那么当请求某一个Servlet的时候,先会进入过滤器中。只有过滤器执行了放行操作的时候,才会继续请求目标的servlet。
使用过滤器的步骤:
第一步:创建一个过滤器,实现filter接口,重写dofilter方法
第二步:配置web.xml文件
<filter>
<filter-name>过滤器名</filter-name>
<filter-class>过滤器包名</filter-class>
</filter>
<filter-mapping>
<filter-name>过滤器名</filter-name>
<url-pattern>/hello</url-pattern>//当用户请求/hello的时候,首先进入过滤器。
</filter-mapping>
FilterConfig
该对象用于获取filter的配置参数。
在init()方法中
//获取过滤器参数
name = filterConfig.getInitParameter("name");
我们可以在filter节点中指定配置参数
<init-param>
<param-name>name</param-name>
<param-value>jacky</param-value>
</init-param>