JavaWeb学习总结文件上传和

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。一、开发环境搭建创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示:二、实现文件上传2.1、文件上传页面和消息提示页面upload.jsp页面的代码如下:1%@pagelanguage=javapageEncoding=UTF-8%2!DOCTYPEHTML3html4head5title文件上传/title6/head78body9formaction=${pageContext.request.contextPath}/servlet/UploadHandleServletenctype=multipart/form-datamethod=post10上传用户:inputtype=textname=usernamebr/11上传文件1:inputtype=filename=file1br/12上传文件2:inputtype=filename=file2br/13inputtype=submitvalue=提交14/form15/body16/htmlmessage.jsp的代码如下:1%@pagelanguage=javapageEncoding=UTF-8%2!DOCTYPEHTML3html4head5title消息提示/title6/head78body9${message}10/body11/html2.2、处理文件上传的ServletUploadHandleServlet的代码如下:1packageme.gacl.web.controller;23importjava.io.File;4importjava.io.FileOutputStream;5importjava.io.IOException;6importjava.io.InputStream;7importjava.util.List;8importjavax.servlet.ServletException;9importjavax.servlet.http.HttpServlet;10importjavax.servlet.http.HttpServletRequest;11importjavax.servlet.http.HttpServletResponse;12importorg.apache.commons.fileupload.FileItem;13importorg.apache.commons.fileupload.disk.DiskFileItemFactory;14importorg.apache.commons.fileupload.servlet.ServletFileUpload;1516publicclassUploadHandleServletextendsHttpServlet{1718publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)19throwsServletException,IOException{20//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全21StringsavePath=this.getServletContext().getRealPath(/WEB-INF/upload);22Filefile=newFile(savePath);23//判断上传文件的保存目录是否存在24if(!file.exists()&&!file.isDirectory()){25System.out.println(savePath+目录不存在,需要创建);26//创建目录27file.mkdir();28}29//消息提示30Stringmessage=;31try{32//使用Apache文件上传组件处理文件上传步骤:33//1、创建一个DiskFileItemFactory工厂34DiskFileItemFactoryfactory=newDiskFileItemFactory();35//2、创建一个文件上传解析器36ServletFileUploadupload=newServletFileUpload(factory);37//解决上传文件名的中文乱码38upload.setHeaderEncoding(UTF-8);39//3、判断提交上来的数据是否是上传表单的数据40if(!ServletFileUpload.isMultipartContent(request)){41//按照传统方式获取数据42return;43}44//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个ListFileItem集合,每一个FileItem对应一个Form表单的输入项45ListFileItemlist=upload.parseRequest(request);46for(FileItemitem:list){47//如果fileitem中封装的是普通输入项的数据48if(item.isFormField()){49Stringname=item.getFieldName();50//解决普通输入项的数据的中文乱码问题51Stringvalue=item.getString(UTF-8);52//value=newString(value.getBytes(iso8859-1),UTF-8);53System.out.println(name+=+value);54}else{//如果fileitem中封装的是上传文件55//得到上传的文件名称,56Stringfilename=item.getName();57System.out.println(filename);58if(filename==null||filename.trim().equals()){59continue;60}61//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt62//处理获取到的上传文件的文件名的路径部分,只保留文件名部分63filename=filename.substring(filename.lastIndexOf(\\)+1);64//获取item中的上传文件的输入流65InputStreamin=item.getInputStream();66//创建一个文件输出流67FileOutputStreamout=newFileOutputStream(savePath+\\+filename);68//创建一个缓冲区69bytebuffer[]=newbyte[1024];70//判断输入流中的数据是否已经读完的标识71intlen=0;72//循环将输入流读入到缓冲区当中,(len=in.read(buffer))0就表示in里面还有数据73while((len=in.read(buffer))0){74//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+\\+filename)当中75out.write(buffer,0,len);76}77//关闭输入流78in.close();79//关闭输出流80out.close();81//删除处理文件上传时生成的临时文件82item.delete();83message=文件上传成功!;84}85}86}catch(Exceptione){87message=文件上传失败!;88e.printStackTrace();8990}91request.setAttribute(message,message);92request.getRequestDispatcher(/message.jsp).forward(request,response);93}9495publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)96throwsServletException,IOException{9798doGet(request,response);99}100}在Web.xml文件中注册UploadHandleServlet1servlet2servlet-nameUploadHandleServlet/servlet-name3servlet-classme.gacl.web.controller.UploadHandleServlet/servlet-class4/servlet56servlet-mapping7servlet-nameUploadHandleServlet/servlet-name8url-pattern/servlet/UploadHandleServlet/url-pattern9/servlet-mapping运行效果如下:文件上传成功之后,上传的文件保存在了WEB-INF目录下的upload目录,如下图所示:2.3、文件上传的细节上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意的1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。4、要限制上传文件的最大值。5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。针对上述提出的5点细节问题,我们来改进一下UploadHandleServlet,改进后的代码如下:1packageme.gacl.web.controller;23importjava.io.File;4importjava.io.FileOutputStream;5importjava.io.IOException;6importjava.io.InputStream;7importjava.util.List;8importjava.util.UUID;910importjavax.servlet.ServletException;11importjavax.servlet.http.HttpServlet;12importjavax.servlet.http.HttpServletRequest;13importjavax.servlet.http.HttpServletResponse;14importorg.apache.commons.fileupload.FileItem;15importorg.apache.commons.fileupload.FileUploadB

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功