JAVA使用commos-fileupload实现文件上传与下载实例解析
首先给大家介绍一文件的上传
实体类
importjava.sql.Timestamp; /** * *@Decription文件上传实体类 * */ publicclassUpfile{ privateStringid;//ID主键使用uuid随机生成 privateStringuuidname;//UUID名称 privateStringfilename;//文件名称 privateStringsavepath;//保存路径 privateTimestampuploadtime;//上传时间 privateStringdescription;//文件描述 privateStringusername;//用户名 publicUpfile(){ super(); } publicUpfile(Stringid,Stringuuidname,Stringfilename,Stringsavepath, Timestampuploadtime,Stringdescription,Stringusername){ super(); this.id=id; this.uuidname=uuidname; this.filename=filename; this.savepath=savepath; this.uploadtime=uploadtime; this.description=description; this.username=username; } publicStringgetDescription(){ returndescription; } publicStringgetFilename(){ returnfilename; } publicStringgetId(){ returnid; } publicStringgetSavepath(){ returnsavepath; } publicTimestampgetUploadtime(){ returnuploadtime; } publicStringgetUsername(){ returnusername; } publicStringgetUuidname(){ returnuuidname; } publicvoidsetDescription(Stringdescription){ this.description=description; } publicvoidsetFilename(Stringfilename){ this.filename=filename; } publicvoidsetId(Stringid){ this.id=id; } publicvoidsetSavepath(Stringsavepath){ this.savepath=savepath; } publicvoidsetUploadtime(Timestampuploadtime){ this.uploadtime=uploadtime; } publicvoidsetUsername(Stringusername){ this.username=username; } publicvoidsetUuidname(Stringuuidname){ this.uuidname=uuidname; } }
页面
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%> <% Stringpath=request.getContextPath(); StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> <html> <head> <basehref="<%=basePath%>"> <title>MyJSP'upload.jsp'startingpage</title> <metahttp-equiv="pragma"content="no-cache"> <metahttp-equiv="cache-control"content="no-cache"> <metahttp-equiv="expires"content="0"> <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <metahttp-equiv="description"content="Thisismypage"> <!-- <linkrel="stylesheet"type="text/css"href="styles.css"> --> </head> <body> <h1>文件上传</h1> <formaction="${pageContext.request.contextPath}/upload"method="post"enctype="multipart/form-data"> <table> <tr> <td>上传用户名:</td> <td><inputtype="text"name="username"/></td> </tr> <tr> <td>上传文件:</td> <td><inputtype="file"name="file"/></td> </tr> <tr> <td>描述:</td> <td><textarearows="5"cols="50"name="description"></textarea></td> </tr> <tr> <td><inputtype="submit"value="上传开始"/></td> </tr> </table> </form> <div>${msg}</div> <ahref="${pageContext.request.contextPath}/index.jsp">返回主页</a> </body> </html>
Servlet
importjava.io.IOException; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException; importorg.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; importorg.apache.commons.fileupload.servlet.ServletFileUpload; importcom.itheima.domain.Upfile; importcom.itheima.exception.MyException; importcom.itheima.service.UpfileService; importcom.itheima.service.impl.UpfileServiceImpl; importcom.itheima.untils.WebUntil; publicclassUploadFileServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //判断表单是不是多个部分组成的 if(!ServletFileUpload.isMultipartContent(request)){ request.setAttribute("msg","表单个设置错误,请检查enctype属性是是否设置正确"); request.getRequestDispatcher("/upload.jsp").forward(request,response); return; } //是多部分组成的就获取并遍历返回一个文件上传对象,包含上传的所有信息 try{ Upfileupfile=WebUntil.upload(request); UpfileServiceupfileService=newUpfileServiceImpl(); booleanflag=upfileService.add(upfile); if(flag){ request.setAttribute("msg","上传成功"); request.getRequestDispatcher("/upload.jsp").forward(request,response); return; }else{ request.setAttribute("msg","上传失败,请重试"); request.getRequestDispatcher("/upload.jsp").forward(request,response); return; } }catch(FileSizeLimitExceededExceptione){ e.printStackTrace(); request.setAttribute("msg","单个文件大小,超过最大限制"); request.getRequestDispatcher("/upload.jsp").forward(request,response); return; }catch(SizeLimitExceededExceptione){ e.printStackTrace(); request.setAttribute("msg","总文件大小,超过最大限制"); request.getRequestDispatcher("/upload.jsp").forward(request,response); return; } } }
工具类
importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.io.UnsupportedEncodingException; importjava.util.ArrayList; importjava.util.List; importjava.util.UUID; importjavax.servlet.http.HttpServletRequest; importorg.apache.commons.fileupload.FileItem; importorg.apache.commons.fileupload.FileUploadBase; importorg.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException; importorg.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; importorg.apache.commons.fileupload.FileUploadException; importorg.apache.commons.fileupload.ProgressListener; importorg.apache.commons.fileupload.disk.DiskFileItemFactory; importorg.apache.commons.fileupload.servlet.ServletFileUpload; importcom.itheima.domain.Upfile; importcom.itheima.exception.MyException; /** *文件上传工具类 *@DecriptionTODO * */ publicclassWebUntil{ /** *文件上传的方法 *@paramrequest请求参数传入 *@return返回一个Upfile对象 *@throwsFileSizeLimitExceededException *@throwsSizeLimitExceededException *@throwsIOException */ publicstaticUpfileupload(HttpServletRequestrequest)throwsFileSizeLimitExceededException,SizeLimitExceededException{ Upfileupfile=newUpfile(); ArrayList<String>fileList=initList(); try{ //获取磁盘文件对象工厂 DiskFileItemFactoryfactory=newDiskFileItemFactory(); Stringtmp=request.getSession().getServletContext().getRealPath("/tmp"); System.out.println(tmp); //初始化工厂 setFactory(factory,tmp); //获取文件上传解析器 ServletFileUploadupload=newServletFileUpload(factory); //初始化解析器 setUpload(upload); //获取文件列表集合 List<FileItem>list=upload.parseRequest(request); //遍历 for(FileItemitems:list){ //判断是不是普通表单个对象 if(items.isFormField()){ //获取上传表单的name StringfieldName=items.getFieldName(); //value StringfieldValue=items.getString("UTF-8"); //判断 if("username".equals(fieldName)){ //设置 upfile.setUsername(fieldValue); }elseif("description".equals(fieldName)){ //设置属性 upfile.setDescription(fieldValue); } }else{ //是文件就准备上传 //获取文件名 Stringfilename=items.getName(); //处理因为浏览器不同而导致的获得的文件名的差异 intindex=filename.lastIndexOf("\\"); if(index!=-1){ filename=filename.substring(index+1); } //生成随机的文件名 Stringuuidname=generateFilename(filename); //获取上传的文件路径 Stringsavepath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload"); //获取请求对象中的输入流 InputStreamin=items.getInputStream(); //将文件打散存放在不同的路径,求出路径 savepath=generateRandomDir(savepath,uuidname); //复制文件 uploadFile(in,savepath,uuidname); Stringid=UUID.randomUUID().toString(); upfile.setId(id); upfile.setSavepath(savepath); upfile.setUuidname(uuidname); upfile.setFilename(filename); //清除缓存 items.delete(); } } }catch(FileUploadBase.FileSizeLimitExceededExceptione){ //抛出出异常 throwe; }catch(FileUploadBase.SizeLimitExceededExceptione){ //抛出出异常 throwe; }catch(FileUploadExceptione){ e.printStackTrace(); }catch(UnsupportedEncodingExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }catch(Exceptione){ e.printStackTrace(); } returnupfile; } /** *初始化文件列表 *@return */ privatestaticArrayList<String>initList(){ ArrayList<String>list=newArrayList<String>(); list.add(".jpg"); list.add(".rar"); list.add(".txt"); list.add(".png"); returnlist; } /** *复制文件 *@paraminitems中的输入流 *@paramsavepath保存路径 *@paramuuidname文件名 */ privatestaticvoiduploadFile(InputStreamin,Stringsavepath, Stringuuidname){ //获取文件 Filefile=newFile(savepath,uuidname); OutputStreamout=null; try{ intlen=0; byte[]buf=newbyte[1024]; //获取输出流 out=newFileOutputStream(file); while((len=in.read(buf))!=-1){ out.write(buf,0,len); } }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } try{ out.close(); }catch(IOExceptione){ e.printStackTrace(); } } } /** *生成随机的存放路径 *@paramsavepath保存路径 *@paramuuidname生成的uuid名称 *@return *使用hashcode完成 */ privatestaticStringgenerateRandomDir(Stringsavepath,Stringuuidname){ //转化为hashcode System.out.println("上传路径"+savepath); System.out.println("UUIDNAME"+uuidname); inthashcode=uuidname.hashCode(); //容器 StringBuildersb=newStringBuilder(); while(hashcode>0){ //与上15 inttmp=hashcode&0xf; sb.append("/"); sb.append(tmp+""); hashcode=hashcode>>4; } //拼接新的路径 Stringpath=savepath+sb.toString(); System.out.println("path"+path); Filefile=newFile(path); //判断路径存不存在 if(!file.exists()){ //不存在就创建 file.mkdirs(); } //返回保存路径 returnpath; } /** *生成新的文件名 *@paramuuidname随机的ID名字 *@paramfilename原来的名 *@return */ privatestaticStringgenerateFilename(Stringfilename){ Stringuuidname=UUID.randomUUID().toString(); returnuuidname.replace("-","").toString()+"_"+filename; } /** *初始化解析器 *@paramupload */ privatestaticvoidsetUpload(ServletFileUploadupload){ //设置字符编码 upload.setHeaderEncoding("utf-8"); //设置文件大小 upload.setFileSizeMax(1024*1024*20); //设置总文件大小 upload.setSizeMax(1024*1024*50); //设置进度监听器 upload.setProgressListener(newProgressListener(){ publicvoidupdate(longpBytesRead,longpContentLength,intpItems){ System.out.println("已经读取:"+pBytesRead+",总共有:"+pContentLength+",第"+pItems+"个"); } }); } /** *工厂初始化方法 *@paramfactory *@paramtmp缓冲目录 */ privatestaticvoidsetFactory(DiskFileItemFactoryfactory,Stringtmp){ ///配置初始化值缓冲区 factory.setSizeThreshold(1024*1024); Filefile=newFile(tmp); //设置缓冲目录 factory.setRepository(file); } }
二文件下载
Servlet
publicclassDownupfileServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //获取ID Stringid=request.getParameter("id"); //业务层的接口 UpfileServiceupfileService=newUpfileServiceImpl(); //根据ID查找这个对象 Upfileupfile=upfileService.findUpfileById(id); if(upfile==null){ return; } //获取文件的真实名称 Stringfilename=upfile.getFilename(); //如果文件名中有中文,需要转码,不然就下载时没有文件名 filename=URLEncoder.encode(filename,"utf-8"); //更改过的名称 Stringuuidname=upfile.getUuidname(); //保存路径 Stringsavepath=upfile.getSavepath(); Filefile=newFile(savepath,uuidname); //判断文件是否存在 if(!file.exists()){ request.setAttribute("msg","下载的文件过期了"); request.getRequestDispatcher("/index").forward(request,response); return; } //设置文件下载响应头信息 response.setHeader("Content-disposition","attachement;filename="+filename); //使用IO流输出 InputStreamin=newFileInputStream(file); ServletOutputStreamout=response.getOutputStream(); intlen=0; byte[]buf=newbyte[1024]; while((len=in.read(buf))!=-1){ out.write(buf,0,len); } in.close(); } }
数据库
createdatabaseupload_download_exercise; useupload_download_exercise; createtableupfiles( idvarchar(100),//使用UUID生成 uuidnamevarchar(255),//uuid加上原来的文件名 filenamevarchar(100),//真实文件名 savepathvarchar(255),//保存路径 uploadtimetimestamp,//上传时间 descriptionvarchar(255),//描述 usernamevarchar(10)上传人 );
以上所述是小编给大家分享的JAVA使用commos-fileupload实现文件上传与下载的相关内容,希望对大家有所帮助。