闲来无事,写一个sevlet实现文件上传!
大部分人喜欢用别人写好的包,如commons-fileupload-1.2.2.jar,来实现文件上传,还有另外有一个包smartupload包 ,这两种方式!
http协议文件上传,通过设置页面中的form的参数enctype为multipart/form-data,参数method="post"来实现文件上传,具体可以参考http文档,RFC_2616_HTTP_1[1].1_超文本传输协议_中文版。servlet通过request.getInputStream()得到输入文件流;参数通过request.getAttribute("name");,切记不要用request.getParameter("name").为啥,各位可以百度一下方法区别。文件可以通过得到文件名(通过request.getAttribute("fileName")),再加路径可以得到new File(FilePath,FileName)。本例可以通过新建一个对像new ParseServletInputStream(HttpServletRequest request,String FilePath),或new ParseServletInputStream(request)来解析输入流,并能通过此类删除上传的文件
本列主要有四个类,分别为ParseServletInputStream.java,ParseRequest.java,BodyRequest,AnnotationLogger;一个接口MultipartParameter定义输入流中的参数。
1.ParseServletInputStream类主要用来接收request,设置文件保存路径及删除上传文件。
源码中设置了两个此类构造方法,一个只有一个参数(request),一个另带一个文件路径的构造方法。源码如下:
2.ParseRequest是一个解析输入流抽像类
定义了一些解析流的公共方法。输入流中的参数有两种,一种参数内型是文件(input type="file "),另一种是参数类型是字符串(<input type="text"> ),参数内型是文件头要解析四行,参数类型是字符串头要解析三行,具体可参考http协议。所以抽象类定义解析四行方法,还有两个共用的方法,解析空行的和清空参数,源文件如下:
3.BodyRequest用来解析输入流
BodyRequest有两个内部类(FileRequest,ParameterRequest)都继承了ParseRequest,FileRequest主要用来解析流是文件类型的类,,ParameterRequest主要用来解析是参数 的类
4.MultipartParameter接口主要定义文件上传参数类型
可以参考http协议,主要定义一些http协议参数名称,源码如下
5.AnnotationLogger类用来注释掉logger和去掉注释掉logger
此类主要用来增加,或删除源文件中的loger输出,如果要logger输出,要增加log4j包,本列版本是log4j-1.2.15.jar
6.应用工程例子
源文件如上,工程下载,可以把项目引入到myeclipse,布暑到tomcat中。通过index.jsp提交form上传文件,FileUpLoad类是(servlet)接收输入流,处理结果通过response输出页面。
index.jsp运行页面如下
servlet接收如下:
文件保存在图片:
如果看不明白,可加Q(4758 2019),如要转载,请注名出处!