这篇文章主要为大家详细介绍了使用文件上传实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
FileUpload文件上传
文件上传是街头流氓的英国国会下院组件提供的上传组件,它最主要的工作就是帮我们解析request.getInpustream()。
使用文件上传组件首先需要引入两个冲突包:
公共-文件上传。冲突
commons-io.jar
文件上传的核心类有DiskFileItemFactory、ServletFileUpload、FileItem。
使用fileUpload固定步骤:
创建工厂类:DiskFileItemFactory factory=new DiskFileItemFactory();
创建解析器:servlet文件上传上传=新servlet文件上传(工厂);
使用解析器解析请求对象:List list=upload.parseRequest(请求);
一个FileItem对象对应一个表单项。FileItem类有如下方法:
String getFieldName():获取表单项的名字的属性值。
String getName():获取文件字段的文件名。如果是普通字段,则返回空
String getString():获取字段的内容。如果是普通字段,则是它的价值值;如果是文件字段,则是文件内容。
String getContentType():获取上传的文件类型,例如文本/纯文本、图像。如果是普通字段,则返回零。
long getSize():获取字段内容的大小,单位是字节。
布尔型isFormField():判断是否是普通表单字段,若是,返回没错,否则返回错误。
InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回价值值的输入流。
前端页面
% @ page language= Java content type= text/html;charset=utf-8
pageEncoding=utf-8%
!文档类型超文本标记语言
超文本标记语言
头
meta charset=utf-8
标题在此插入标题/标题
/头
身体
表单操作=上传servlet enctype= multipart/form-data 方法= post
输入类型=文本名称=用户名
输入类型=密码名称=密码
输入类型=文件名称=图片
输入类型=提交
/表单
/body
/html
UploadServlet
包pers。张。servlet
导入Java。io。文件;
导入Java。io。io异常;
导入Java。util。列表;
导入Java。util。uuid
导入javax。servlet。servlet异常;
导入javax。servlet。http。http servlet
导入javax。servlet。http。http servlet请求;
导入javax。servlet。http。http servlet响应;
导入org。阿帕奇。公地。文件上传。文件项目;
导入组织。阿帕奇。公地。文件上传。磁盘。磁盘fileitemfactory
导入org。阿帕奇。公地。文件上传。servlet。servlet文件上传;
公共类UploadServlet扩展HttpServlet {
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)引发ServletException,IOException {
doPost(请求、响应);
}
受保护的void doPost(HttpServletRequest请求,HttpServletResponse响应)引发ServletException,IOException {
DiskFileItemFactory factory=new DiskFileItemFactory();
servlet文件上传上传=新servlet文件上传(工厂);
请求。setcharacterencoding(“utf-8”);
//文件名中文乱码处理也可以如此写
//上传。setheaderencoding( utf-8 );
//设置缓冲区大小与临时文件目录
工厂。setsize阈值(1024 * 1024 * 10);
文件上传temp=新文件( e: 上传temp );
上传温度。mkdirs();
工厂。设置存储库(上传临时);
//设置单个文件大小限制
上传。setfilesizemax(1024 * 1024 * 10);
//设置所有文件总和大小限制
上传。setsizemax(1024 * 1024 * 30);
尝试{
ListFileItem list=upload。解析请求(请求);
系统。出去。println(列表);
for (FileItem fileItem:list){
如果(!fileitem。是formfield()fileitem。getname()!=null!.等于(fileitem。getname()){
string filName=fileitem。getname();
//利用UUID生成伪随机字符串,作为文件名避免重复
String uuid=UUID.randomUUID().toString();
//获取文件后缀名
字符串后缀=filname。子串(filname。lastindexof( . ));
//获取文件上传目录路径,在项目部署路径下的上传目录里。若想让浏览器不能直接访问到图片,可以放在WEB-INF下
string upload path=request . getsession()。getServletContext()。get real path(/upload );
File file=新文件(upload path);
file . mkdirs();
//将文件写入磁盘。在这一行执行之后,如果有任何临时文件,它将被自动删除。
fileItem.write(新文件(uploadPath,uuid后缀));
}
}
} catch(异常e) {
e . printstacktrace();
}
}
}
测试
控制台打印:
复制代码如下:【name=null,store location=e: upload temp upload _ 9e 72474 _ 16 ddcc cabe 6 _ _ 8000 _ 000000 . tmp,size=5字节,isform field=true,fieldname=username,name=null,store location=e: upload temp upload _ 9e 72474 _ 16 ddcc cabe 6 _ _ 8000 _ 000001 . tmp,size=6字节,isform field=
项目部署路径下的上传文件夹:
除了以上方法,还要注意使用fileUpload组件实现文件上传:
中文文件名乱码处理:servlet fileupload.setheader编码(“UTF-8”)或request . setcharacter encoding(“UTF-8”);
常见表单域的中文乱码处理:新字符串(str。getbytes ("ISO-8859-1 "," UTF-8 "));
设置内存缓冲区的大小,默认为10kb:diskfileitemcfactory . setsize threshold(1024 * 1024);
指定临时文件目录。如果单个文件的大小超过了内存缓冲区,文件会被临时缓存在这个目录下:diskfileitemcfactory . set repository(file);
设置单个文件大小限制,如果一个文件超过这个大小,就会抛出一个fileuploadbase . filesizelimitexceedexception:servlet file upload . setfilesizemax(1024102410);
设置所有文件,即请求大小限制。如果文件之和超过这个大小,就会抛出fileuploadbase . sizelimitedexception:servlet file upload . setsizemax(1024102420);
使用UUID生成伪随机字符串作为文件名以避免重复:UUID.randomUUID()。toString();
将文件写入硬盘。写入后,系统会自动删除放置在临时文件目录中的文件:fileitem.write(新文件(路径,文件名));
另外:如果没有指定临时文件目录,默认采用系统默认的临时文件路径,可以通过system . getproperty(" Java . io . tmpdir ")获取。tomcat系统默认的临时目录是“Tomcat安装目录/temp/”。
Apache文件上传组件在解析上传数据中各个字段的内容时,需要临时保存解析后的数据,以便以后对数据进行进一步处理(保存在磁盘上的特定位置或者插入数据库)。因为Java虚拟机默认可以使用的内存空间是有限的,超过限制就会抛出“java.lang.OutOfMemoryError”错误。如果上传的文件很大,比如800M文件,文件的内容无法临时保存在内存中,那么Apache文件上传组件就用临时文件来代替保存数据;但如果上传的文件很小,比如600字节的文件,显然直接存储在内存中性能会更好。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。