java文件上传下载功能实现代码
本文实例为大家分享了文件上传下载java实现代码,供大家参考,具体内容如下
前台:
1.提交方式:post
2.表单中有文件上传的表单项:<inputtype=”file”/>
3.指定表单类型:
默认类型:enctype="application/x-www-form-urlencoded"
文件上传类型:multipart/form-data
FileUpload
文件上传功能开发中比较常用,apache也提供了文件上传组件!
FileUpload组件:
1.下载源码
2.项目中引入jar文件
commons-fileupload-1.2.1.jar【文件上传组件核心jar包】
commons-io-1.4.jar【封装了对文件处理的相关工具类】
使用:
publicclassUploadServletextendsHttpServlet{ //upload目录,保存上传的资源 publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ /*********文件上传组件:处理文件上传************/ try{ //1.文件上传工厂 FileItemFactoryfactory=newDiskFileItemFactory(); //2.创建文件上传核心工具类 ServletFileUploadupload=newServletFileUpload(factory); //一、设置单个文件允许的最大的大小:30M upload.setFileSizeMax(30*1024*1024); //二、设置文件上传表单允许的总大小:80M upload.setSizeMax(80*1024*1024); //三、设置上传表单文件名的编码 //相当于:request.setCharacterEncoding("UTF-8"); upload.setHeaderEncoding("UTF-8"); //3.判断:当前表单是否为文件上传表单 if(upload.isMultipartContent(request)){ //4.把请求数据转换为一个个FileItem对象,再用集合封装 List<FileItem>list=upload.parseRequest(request); //遍历:得到每一个上传的数据 for(FileItemitem:list){ //判断:普通文本数据 if(item.isFormField()){ //普通文本数据 StringfieldName=item.getFieldName();//表单元素名称 Stringcontent=item.getString();//表单元素名称,对应的数据 //item.getString("UTF-8");指定编码 System.out.println(fieldName+""+content); } //上传文件(文件流)---->上传到upload目录下 else{ //普通文本数据 StringfieldName=item.getFieldName();//表单元素名称 Stringname=item.getName();//文件名 Stringcontent=item.getString();//表单元素名称,对应的数据 Stringtype=item.getContentType();//文件类型 InputStreamin=item.getInputStream();//上传文件流 /* *四、文件名重名 *对于不同用户readme.txt文件,不希望覆盖! *后台处理:给用户添加一个唯一标记! */ //a.随机生成一个唯一标记 Stringid=UUID.randomUUID().toString(); //b.与文件名拼接 name=id+"#"+name; //获取上传基路径 Stringpath=getServletContext().getRealPath("/upload"); //创建目标文件 Filefile=newFile(path,name); //工具类,文件上传 item.write(file); item.delete();//删除系统产生的临时文件 System.out.println(); } } } else{ System.out.println("当前表单不是文件上传表单,处理失败!"); } }catch(Exceptione){ e.printStackTrace(); } } //手动实现过程 privatevoidupload(HttpServletRequestrequest)throwsIOException, UnsupportedEncodingException{ /* request.getParameter("");//GET/POST request.getQueryString();//获取GET提交的数据 request.getInputStream();//获取post提交的数据*/ /***********手动获取文件上传表单数据************/ //1.获取表单数据流 InputStreamin=request.getInputStream(); //2.转换流 InputStreamReaderinStream=newInputStreamReader(in,"UTF-8"); //3.缓冲流 BufferedReaderreader=newBufferedReader(inStream); //输出数据 Stringstr=null; while((str=reader.readLine())!=null){ System.out.println(str); } //关闭 reader.close(); inStream.close(); in.close(); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ this.doGet(request,response); } }
案例:
Index.jsp
<body> <ahref="${pageContext.request.contextPath}/upload.jsp">文件上传</a> <ahref="${pageContext.request.contextPath}/fileServlet?method=downList">文件下载</a> </body>
Upload.jsp
<body> <formname="frm_test"action="${pageContext.request.contextPath}/fileServlet?method=upload"method="post"enctype="multipart/form-data"> <%--<inputtype="hidden"name="method"value="upload">--%> 用户名:<inputtype="text"name="userName"><br/> 文件:<inputtype="file"name="file_img"><br/> <inputtype="submit"value="提交"> </form> </body>
FileServlet.java
/** *处理文件上传与下载 *@authorJie.Yuan * */ publicclassFileServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //获取请求参数:区分不同的操作类型 Stringmethod=request.getParameter("method"); if("upload".equals(method)){ //上传 upload(request,response); } elseif("downList".equals(method)){ //进入下载列表 downList(request,response); } elseif("down".equals(method)){ //下载 down(request,response); } } /** *1.上传 */ privatevoidupload(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ try{ //1.创建工厂对象 FileItemFactoryfactory=newDiskFileItemFactory(); //2.文件上传核心工具类 ServletFileUploadupload=newServletFileUpload(factory); //设置大小限制参数 upload.setFileSizeMax(10*1024*1024);//单个文件大小限制 upload.setSizeMax(50*1024*1024);//总文件大小限制 upload.setHeaderEncoding("UTF-8");//对中文文件编码处理 //判断 if(upload.isMultipartContent(request)){ //3.把请求数据转换为list集合 List<FileItem>list=upload.parseRequest(request); //遍历 for(FileItemitem:list){ //判断:普通文本数据 if(item.isFormField()){ //获取名称 Stringname=item.getFieldName(); //获取值 Stringvalue=item.getString(); System.out.println(value); } //文件表单项 else{ /********文件上传***********/ //a.获取文件名称 Stringname=item.getName(); //----处理上传文件名重名问题---- //a1.先得到唯一标记 Stringid=UUID.randomUUID().toString(); //a2.拼接文件名 name=id+"#"+name; //b.得到上传目录 StringbasePath=getServletContext().getRealPath("/upload"); //c.创建要上传的文件对象 Filefile=newFile(basePath,name); //d.上传 item.write(file); item.delete();//删除组件运行时产生的临时文件 } } } }catch(Exceptione){ e.printStackTrace(); } } /** *2.进入下载列表 */ privatevoiddownList(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示 //1.初始化map集合Map<包含唯一标记的文件名,简短文件名>; Map<String,String>fileNames=newHashMap<String,String>(); //2.获取上传目录,及其下所有的文件的文件名 StringbathPath=getServletContext().getRealPath("/upload"); //目录 Filefile=newFile(bathPath); //目录下,所有文件名 Stringlist[]=file.list(); //遍历,封装 if(list!=null&&list.length>0){ for(inti=0;i<list.length;i++){ //全名 StringfileName=list[i]; //短名 StringshortName=fileName.substring(fileName.lastIndexOf("#")+1); //封装 fileNames.put(fileName,shortName); } } //3.保存到request域 request.setAttribute("fileNames",fileNames); //4.转发 request.getRequestDispatcher("/downlist.jsp").forward(request,response); } /** *3.处理下载 */ privatevoiddown(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //获取用户下载的文件名称(url地址后追加数据,get) StringfileName=request.getParameter("fileName"); fileName=newString(fileName.getBytes("ISO8859-1"),"UTF-8"); //先获取上传目录路径 StringbasePath=getServletContext().getRealPath("/upload"); //获取一个文件流 InputStreamin=newFileInputStream(newFile(basePath,fileName)); //如果文件名是中文,需要进行url编码 fileName=URLEncoder.encode(fileName,"UTF-8"); //设置下载的响应头 response.setHeader("content-disposition","attachment;fileName="+fileName); //获取response字节流 OutputStreamout=response.getOutputStream(); byte[]b=newbyte[1024]; intlen=-1; while((len=in.read(b))!=-1){ out.write(b,0,len); } //关闭 out.close(); in.close(); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ this.doGet(request,response); } }
以上就是本文的全部内容,希望对大家的学习有所帮助。