`

java web 实现上传下载

 
阅读更多

jsp页面代码:

  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>
  4. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
  8. <title>上传文件</title>
  9. </head>
  10. <body>
  11. <fontcolor="red"size="3px"><b>${error}</b></font>
  12. <tableborder="1"width="60%">
  13. <tr>
  14. <th>用户名</th>
  15. <th>性别</th>
  16. <th>头像</th>
  17. <th>IP地址</th>
  18. <th>上传文件名</th>
  19. <th>操作</th>
  20. </tr>
  21. <c:forEachitems="${list}"var="user">
  22. <tr>
  23. <td>${user.name}</td>
  24. <td>${user.sex==true?"男":"女"}</td>
  25. <td><imgsrc="${user.pic}"height="120"></td>
  26. <td>${user.ip}</td>
  27. <td>${user.fileName}</td>
  28. <td><ahref="/upload?mode=download&id=${user.id}">下载</a></td>
  29. </tr>
  30. </c:forEach>
  31. </table>
  32. <formaction="/upload?mode=upload"method="post">
  33. <inputtype="submit"value="去上传..."/>
  34. </form>
  35. </body>
  36. </html>

jsp页面代码:

  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>
  4. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
  8. <title>上传文件</title>
  9. <scripttype="text/javascript">
  10. vartag=true;
  11. functiongo(){
  12. if(tag){
  13. document.forms[0].submit();
  14. tag=false;
  15. }else{
  16. alert("正在提交中,请勿重复提交请求……");
  17. }
  18. }
  19. </script>
  20. </head>
  21. <body>
  22. <fontcolor="red"size="3px"><b>${error}</b></font>
  23. <formaction="/upload?mode=add"method="post"enctype="multipart/form-data">
  24. <inputtype="hidden"name="randomName"value="${randomName}"/>
  25. <inputtype="hidden"name="randomValue"value="${randomValue}"/>
  26. <table>
  27. <tr>
  28. <td>用户名:</td>
  29. <td><inputtype="text"name="name"/></td>
  30. </tr>
  31. <tr>
  32. <td>性 别:</td>
  33. <td><inputtype="radio"name="sex"value="true"/>
  34. <inputtype="radio"name="sex"value="false"/>
  35. </td>
  36. </tr>
  37. <tr>
  38. <td>头 像:</td>
  39. <td><inputtype="file"name="pic"/></td>
  40. </tr>
  41. <!--<tr>
  42. <td>IP地址:</td>
  43. <td><inputtype="text"name="ip"/></td>
  44. </tr>-->
  45. <tr>
  46. <td>文件名:</td>
  47. <td><inputtype="file"name="fileName"/></td>
  48. </tr>
  49. <tr>
  50. <!--<tdcolspan="2"align="center"><inputtype="button"value="提交"onclick="go()"/></td>-->
  51. <tdcolspan="2"align="center"><inputtype="submit"value="提交""/>
  52. </tr>
  53. </table>
  54. </form>
  55. </body>
  56. </html>
User .java代码:

  1. packagecn.itcast.cd.domain;
  2. publicclassUser{
  3. privateLongid;
  4. privateStringname;
  5. privateBooleansex;
  6. privateStringpic;
  7. privateStringip;
  8. privateStringfileName;
  9. privateStringfilePath;
  10. privatelongfileSize;
  11. publicStringgetName(){
  12. returnname;
  13. }
  14. publicvoidsetName(Stringname){
  15. this.name=name;
  16. }
  17. publicBooleangetSex(){
  18. returnsex;
  19. }
  20. publicvoidsetSex(Booleansex){
  21. this.sex=sex;
  22. }
  23. publicStringgetFileName(){
  24. returnfileName;
  25. }
  26. publicvoidsetFileName(StringfileName){
  27. this.fileName=fileName;
  28. }
  29. publicStringgetFilePath(){
  30. returnfilePath;
  31. }
  32. publicvoidsetFilePath(StringfilePath){
  33. this.filePath=filePath;
  34. }
  35. publicLonggetId(){
  36. returnid;
  37. }
  38. publicvoidsetId(Longid){
  39. this.id=id;
  40. }
  41. publicStringgetIp(){
  42. returnip;
  43. }
  44. publicvoidsetIp(Stringip){
  45. this.ip=ip;
  46. }
  47. publicStringgetPic(){
  48. returnpic;
  49. }
  50. publicvoidsetPic(Stringpic){
  51. this.pic=pic;
  52. }
  53. publiclonggetFileSize(){
  54. returnfileSize;
  55. }
  56. publicvoidsetFileSize(longfileSize){
  57. this.fileSize=fileSize;
  58. }
  59. @Override
  60. publicStringtoString(){
  61. return"User[id="+id+",name="+name+",sex="+sex+",pic="
  62. +pic+",ip="+ip+",fileName="+fileName+",filePath="
  63. +filePath+",fileSize="+fileSize+"]";
  64. }
  65. }
IUserDAO 接口:
[java]
view plaincopyprint?
  1. packagecn.itcast.cd.dao;
  2. importjava.util.List;
  3. importcn.itcast.cd.domain.User;
  4. publicinterfaceIUserDAO{
  5. voidadd(Useruser);
  6. List<User>list();
  7. Userget(Longid);
  8. }
BaseDao .java代码:

[java] view plaincopyprint?

  1. packagecn.itcast.cd.daoImpl;
  2. importjava.sql.SQLException;
  3. importorg.apache.commons.dbutils.QueryRunner;
  4. importorg.apache.commons.dbutils.ResultSetHandler;
  5. importcn.itcast.cd.Utils.Utils;
  6. publicclassBaseDao{
  7. //使用DbUtils中的QueryRunner对象.
  8. privateQueryRunnerqueryRunner=newQueryRunner(Utils.getDataSource());
  9. /*
  10. *执行修改
  11. */
  12. publicvoidexeUpdate(Stringsql,Object...params){
  13. try{
  14. queryRunner.update(sql,params);
  15. }catch(SQLExceptione){
  16. e.printStackTrace();
  17. }
  18. }
  19. /*
  20. *执行查询
  21. */
  22. public<T>TexeQuery(Stringsql,ResultSetHandler<T>rsh,Object...params){
  23. try{
  24. returnqueryRunner.query(sql,rsh,params);
  25. }catch(SQLExceptione){
  26. e.printStackTrace();
  27. }
  28. returnnull;
  29. }
  30. }

UserDAOImpl.java实现类:
[java] view plaincopyprint?

  1. packagecn.itcast.cd.daoImpl;
  2. importjava.util.List;
  3. importorg.apache.commons.dbutils.handlers.BeanHandler;
  4. importorg.apache.commons.dbutils.handlers.BeanListHandler;
  5. importcn.itcast.cd.dao.IUserDAO;
  6. importcn.itcast.cd.domain.User;
  7. publicclassUserDAOImplextendsBaseDaoimplementsIUserDAO{
  8. @Override
  9. publicvoidadd(Useruser){
  10. Stringsql="insertintouservalues(null,?,?,?,?,?,?)";
  11. Object[]params={user.getName(),user.getSex(),user.getPic(),user.getIp(),
  12. user.getFileName(),user.getFilePath()};
  13. exeUpdate(sql,params);
  14. }
  15. @Override
  16. publicList<User>list(){
  17. Stringsql="select*fromuser";
  18. returnexeQuery(sql,newBeanListHandler<User>(User.class));
  19. }
  20. @Override
  21. publicUserget(Longid){
  22. Stringsql="select*fromuserwhereid=?";
  23. returnexeQuery(sql,newBeanHandler<User>(User.class),id);
  24. }
  25. }

BaseServlet.java代码:

[java] view plaincopyprint?

  1. packagecn.itcast.cd.servlet;
  2. importjava.io.IOException;
  3. importjava.lang.reflect.Method;
  4. importjavax.servlet.ServletException;
  5. importjavax.servlet.http.HttpServlet;
  6. importjavax.servlet.http.HttpServletRequest;
  7. importjavax.servlet.http.HttpServletResponse;
  8. importorg.apache.commons.lang3.StringUtils;
  9. publicclassBaseServletextendsHttpServlet{
  10. privatestaticfinallongserialVersionUID=1L;
  11. @Override
  12. protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
  13. throwsServletException,IOException{
  14. req.setCharacterEncoding("UTF-8");
  15. Stringmode=req.getParameter("mode");
  16. if(StringUtils.isNotBlank(mode)){
  17. try{
  18. Methodmethod=this.getClass().getMethod(mode,
  19. HttpServletRequest.class,HttpServletResponse.class);
  20. method.invoke(this,req,resp);
  21. }catch(Exceptione){
  22. e.printStackTrace();
  23. }
  24. }else{
  25. doMethod(req,resp);//默认调用
  26. }
  27. }
  28. protectedvoiddoMethod(HttpServletRequestreq,HttpServletResponseresp){
  29. }
  30. }

MyHttpServletRequest.java类:

[java] view plaincopyprint?

  1. packagecn.itcast.cd.servlet;
  2. importjava.io.File;
  3. importjava.io.UnsupportedEncodingException;
  4. importjava.util.HashMap;
  5. importjava.util.List;
  6. importjava.util.Map;
  7. importjava.util.UUID;
  8. importjavax.servlet.http.HttpServletRequest;
  9. importjavax.servlet.http.HttpServletRequestWrapper;
  10. importorg.apache.commons.fileupload.FileItem;
  11. importorg.apache.commons.fileupload.FileItemFactory;
  12. importorg.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
  13. importorg.apache.commons.fileupload.FileUploadException;
  14. importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
  15. importorg.apache.commons.fileupload.servlet.ServletFileUpload;
  16. importorg.apache.commons.io.FilenameUtils;
  17. importcn.itcast.cd.Utils.MyException;
  18. importcn.itcast.cd.Utils.UploadFileInfo;
  19. publicclassMyHttpServletRequestextendsHttpServletRequestWrapper{
  20. //装在普通表单元素的map
  21. privateMap<String,String>formFiledMap=newHashMap<String,String>();
  22. //装在上传表单元素的Map
  23. privateMap<String,FileItem>uploadFieldMap=newHashMap<String,FileItem>();
  24. BooleanisMultipartContent=false;
  25. publicMyHttpServletRequest(HttpServletRequestrequest){
  26. super(request);
  27. //检查是否是文件上传请求
  28. isMultipartContent=ServletFileUpload.isMultipartContent(request);
  29. if(isMultipartContent){
  30. //创建工程,设置上传最大的内存空间和临时文件存放位置.
  31. FileItemFactoryfactory=newDiskFileItemFactory(1024*1024*10,
  32. newFile("D:/tmp"));
  33. ServletFileUploadfileUpload=newServletFileUpload(factory);
  34. fileUpload.setFileSizeMax(1024*1024);//设置单个文件上传的最大值为1M.
  35. fileUpload.setSizeMax(1024*1024*5);//设置整个表单的文件上传最大值为5M.
  36. try{
  37. List<FileItem>fileItems=fileUpload.parseRequest(request);
  38. for(FileItemfileItem:fileItems){
  39. //是否是普通表单元素,即type不为file的表单元素
  40. if(fileItem.isFormField()){
  41. formFiledMap.put(fileItem.getFieldName(),
  42. fileItem.getString("UTF-8"));
  43. }else{
  44. if(fileItem.getSize()>0){
  45. uploadFieldMap.put(fileItem.getFieldName(),
  46. fileItem);
  47. }
  48. }
  49. }
  50. }catch(SizeLimitExceededExceptione){
  51. thrownewMyException("上传文件的大小超过限制!");
  52. }catch(FileUploadExceptione){
  53. e.printStackTrace();
  54. }catch(UnsupportedEncodingExceptione){
  55. e.printStackTrace();
  56. }
  57. }
  58. }
  59. //包装原来的方法
  60. @Override
  61. publicStringgetParameter(Stringname){
  62. //是上传文件的表单,要得到参数值,直接根据name,取存在map中的值.
  63. if(isMultipartContent){
  64. returnformFiledMap.get(name);
  65. }else{
  66. returnsuper.getParameter(name);
  67. }
  68. }
  69. //已经将Map修改了,覆盖原来的方法
  70. @Override
  71. publicMapgetParameterMap(){
  72. if(isMultipartContent){
  73. returnformFiledMap;
  74. }else{
  75. returnsuper.getParameterMap();
  76. }
  77. }
  78. /**
  79. *上传表单中指定表单元素中的文件.
  80. *
  81. *@paramformFieldName
  82. *表单中元素的名称
  83. *@paramtagPath
  84. *上传的目标目录,即服务器上存放上传文件的目录.
  85. *
  86. *@return由于上传成功后,我们需要将上传的文件名和文件地址存放到数据库,
  87. *也即需要返回给Servlet上传的文件信息,故将文件信息封装成一个对象返回.
  88. *
  89. */
  90. publicUploadFileInfoupload(StringformFieldName,StringtagPath){
  91. FileItemfileItem=uploadFieldMap.get(formFieldName);
  92. if(fileItem!=null){
  93. //得到文件名fileItem.getName()有些浏览器可能得到的是全路径,而这里只需要文件名
  94. StringsrcFileName=FilenameUtils.getName(fileItem.getName());
  95. longfileSize=fileItem.getSize();
  96. //不同的用户可能上传相同的文件名,不处理就被覆盖,所以这里需要用唯一标示进行文件区分.
  97. StringtagFilePath=tagPath+"/"+UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(srcFileName);
  98. if(!tagPath.startsWith("/")){
  99. tagPath="/"+tagPath;
  100. }
  101. //判断目录是否存在,不存在就创建
  102. Filedir=newFile(getSession().getServletContext().getRealPath("/")+tagPath);
  103. if(!dir.exists()){
  104. dir.mkdirs();
  105. }
  106. //写到指定目录
  107. try{
  108. fileItem.write(newFile(getSession().getServletContext().getRealPath("/"),tagFilePath));
  109. }catch(Exceptione){
  110. e.printStackTrace();
  111. }
  112. returnnewUploadFileInfo(srcFileName,tagFilePath,fileSize);
  113. }
  114. returnnull;
  115. }
  116. }

UploadServlet.java类:

[java] view plaincopyprint?

  1. packagecn.itcast.cd.servlet;
  2. importjava.io.BufferedInputStream;
  3. importjava.io.BufferedOutputStream;
  4. importjava.io.File;
  5. importjava.io.FileInputStream;
  6. importjava.io.IOException;
  7. importjava.io.UnsupportedEncodingException;
  8. importjava.net.URLEncoder;
  9. importjava.util.List;
  10. importjava.util.UUID;
  11. importjavax.servlet.ServletException;
  12. importjavax.servlet.http.HttpServletRequest;
  13. importjavax.servlet.http.HttpServletResponse;
  14. importorg.apache.catalina.startup.SetAllPropertiesRule;
  15. importorg.apache.commons.lang3.StringUtils;
  16. importcn.itcast.cd.Utils.MyException;
  17. importcn.itcast.cd.Utils.UploadFileInfo;
  18. importcn.itcast.cd.dao.IUserDAO;
  19. importcn.itcast.cd.daoImpl.UserDAOImpl;
  20. importcn.itcast.cd.domain.User;
  21. /**
  22. *ServletimplementationclassUploadServlet
  23. */
  24. publicclassUploadServletextendsBaseServlet{
  25. privatestaticfinallongserialVersionUID=1L;
  26. IUserDAOdao=null;
  27. @Override
  28. publicvoidinit()throwsServletException{
  29. dao=newUserDAOImpl();
  30. }
  31. publicvoidadd(HttpServletRequestrequest,HttpServletResponseresponse)
  32. throwsInterruptedException{
  33. //request不能接收上传文件的表单参数,返回全部为null,所以用MyHttpServletRequest类进行包装,单独处理.
  34. //Thread.sleep(1000);
  35. MyHttpServletRequestmyRequest=null;
  36. try{
  37. myRequest=newMyHttpServletRequest(request);
  38. }catch(MyExceptione){//捕捉自定义异常,提示用户上传文件的大小限制
  39. request.setAttribute("error",e.getMessage());
  40. upload(request,response);
  41. return;
  42. }
  43. /*
  44. *从页面得到标示信息,由于是文件上传的请求,必须用myRequest
  45. */
  46. StringrandomName=myRequest.getParameter("randomName");
  47. StringrandomValue=myRequest.getParameter("randomValue");
  48. //session中的标示.
  49. StringrandomValueInSession=(String)myRequest.getSession().getAttribute(randomName);
  50. //System.out.println(randomName+""+randomValue+""+randomValueInSession);
  51. if(StringUtils.isNotBlank(randomValueInSession)&&
  52. StringUtils.isNotBlank(randomValue)&&StringUtils.isNotBlank(randomName)
  53. &&randomValueInSession.equals(randomValue)){
  54. //接收普通表单元素的参数信息
  55. Stringname=myRequest.getParameter("name");
  56. Stringsex=myRequest.getParameter("sex");
  57. //封装对象
  58. Useruser=newUser();
  59. user.setName(name);
  60. user.setSex(Boolean.parseBoolean(sex));
  61. Stringip=request.getRemoteAddr();
  62. user.setIp(ip);
  63. //上传头像信息
  64. UploadFileInfopicInfo=myRequest.upload("pic","/headPic");
  65. if(picInfo!=null){
  66. user.setPic(picInfo.getTagFilePath());
  67. }
  68. UploadFileInfofileInfo=myRequest.upload("fileName",
  69. "/WEB-INF/resource");
  70. if(fileInfo!=null){
  71. user.setFilePath(fileInfo.getTagFilePath());
  72. user.setFileName(fileInfo.getSrcFileName());
  73. user.setFileSize(fileInfo.getFileSize());
  74. }
  75. dao.add(user);
  76. //提交完成移除session中设置的随机标示
  77. request.getSession().removeAttribute(randomName);
  78. }else{
  79. request.setAttribute("error","重复提交请求……");
  80. }
  81. list(request,response);
  82. }
  83. publicvoidlist(HttpServletRequestrequest,HttpServletResponseresponse){
  84. List<User>list=dao.list();
  85. request.setAttribute("list",list);
  86. try{
  87. request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(
  88. request,response);
  89. }catch(ServletExceptione){
  90. e.printStackTrace();
  91. }catch(IOExceptione){
  92. e.printStackTrace();
  93. }
  94. }
  95. publicvoidupload(HttpServletRequestrequest,HttpServletResponseresponse){
  96. try{
  97. //防止重复提交
  98. StringrandomName=UUID.randomUUID().toString();
  99. StringrandomValue=UUID.randomUUID().toString();
  100. request.setAttribute("randomName",randomName);
  101. request.setAttribute("randomValue",randomValue);
  102. //当前产生的标示放到session.
  103. request.getSession().setAttribute(randomName,randomValue);
  104. request.getRequestDispatcher("/WEB-INF/jsp/upload.jsp").forward(
  105. request,response);
  106. }catch(ServletExceptione){
  107. e.printStackTrace();
  108. }catch(IOExceptione){
  109. e.printStackTrace();
  110. }
  111. }
  112. @Override
  113. protectedvoiddoMethod(HttpServletRequestrequest,
  114. HttpServletResponseresponse){
  115. list(request,response);
  116. }
  117. publicvoiddownload(HttpServletRequestrequest,
  118. HttpServletResponseresponse){
  119. Stringid=request.getParameter("id");
  120. Useruser=dao.get(Long.parseLong(id));
  121. //发送下载请求给浏览器
  122. response.setContentType("application/x-msdownload");
  123. try{
  124. //解决下载时文件名乱码问题.
  125. response.setHeader("Content-Disposition","attachment;filename="
  126. +URLEncoder.encode(user.getFileName(),"utf-8"));
  127. }catch(UnsupportedEncodingExceptione){
  128. e.printStackTrace();
  129. }
  130. BufferedOutputStreambos=null;
  131. BufferedInputStreambis=null;
  132. try{
  133. bos=newBufferedOutputStream(response.getOutputStream());
  134. bis=newBufferedInputStream(newFileInputStream(newFile(
  135. getServletContext().getRealPath("/"),user.getFilePath())));
  136. byte[]b=newbyte[1024];
  137. intlenth=0;
  138. while((lenth=bis.read(b))!=-1){
  139. bos.write(b,0,lenth);
  140. bos.flush();
  141. }
  142. }catch(IOExceptione){
  143. e.printStackTrace();
  144. }finally{
  145. try{
  146. bos.close();
  147. bis.close();
  148. }catch(IOExceptione){
  149. e.printStackTrace();
  150. }
  151. }
  152. }
  153. }

MyException.java类

[java] view plaincopyprint?

  1. packagecn.itcast.cd.Utils;
  2. publicclassMyExceptionextendsRuntimeException{
  3. publicMyException(Stringmessage){
  4. super(message);
  5. }
  6. }

UploadFileInfo.java类:

[java] view plaincopyprint?

  1. packagecn.itcast.cd.Utils;
  2. publicclassUploadFileInfo{
  3. privateStringsrcFileName;
  4. privateStringtagFilePath;
  5. privatelongfileSize;
  6. publicStringgetSrcFileName(){
  7. returnsrcFileName;
  8. }
  9. publicvoidsetSrcFileName(StringsrcFileName){
  10. this.srcFileName=srcFileName;
  11. }
  12. publicStringgetTagFilePath(){
  13. returntagFilePath;
  14. }
  15. publicvoidsetTagFilePath(StringtagFilePath){
  16. this.tagFilePath=tagFilePath;
  17. }
  18. publiclonggetFileSize(){
  19. returnfileSize;
  20. }
  21. publicvoidsetFileSize(longfileSize){
  22. this.fileSize=fileSize;
  23. }
  24. publicUploadFileInfo(StringsrcFileName,StringtagFilePath,longfileSize){
  25. super();
  26. this.srcFileName=srcFileName;
  27. this.tagFilePath=tagFilePath;
  28. this.fileSize=fileSize;
  29. }
  30. }
Utils.java类:

[java] view plaincopyprint?

  1. packagecn.itcast.cd.Utils;
  2. importjava.util.Properties;
  3. importjavax.sql.DataSource;
  4. importorg.apache.commons.dbcp.BasicDataSourceFactory;
  5. publicclassUtils{
  6. privatestaticDataSourcedataSource;
  7. static{
  8. Propertiesproperties=newProperties();
  9. try{
  10. properties.load(Utils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
  11. dataSource=BasicDataSourceFactory.createDataSource(properties);
  12. }catch(Exceptione){
  13. e.printStackTrace();
  14. }
  15. }
  16. publicstaticDataSourcegetDataSource(){
  17. returndataSource;
  18. }
  19. }



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics