javaWeb上传文件

本文详细介绍了JavaWeb中实现文件上传的步骤,包括视图层的表单设置,如需设置`enctype="multipart/form-data"`,以及控制器层的处理,如使用`DiskFileItemFactory`和`ServletFileUpload`来解析请求,处理每个上传的`FileItem`对象,最终将文件保存到服务器并清理临时文件。

【1】视图层

1)表单method 必须为post

2)设置form标签的enctype属性为multipart/form-data

  如果没有设置enctype浏览器是无法将文件自身传递到服务端

<form  method="post"  enctype="multipart/form-data" action="#">

<table><tr><td>文件</td><td><input type="file" name="file"/></td></tr>    

      <tr><td>上传人姓名</td><td><input type="text" name="perosnName"/></td></tr> 

      <tr><td><button type="submit">上传</button></td></tr>   

 </table>

</form>

注意如果设置enctype属性为multipart/form-data,那么请求的参数数据格式就不是键值对的格式在后台不能通过request.getParameter(name);  获取数据

【2】控制器层

 

  1. 提供file组件-导入commons-fileupload-1.3.2.jar与commons-io-2.5.jar

 DiskFileItemFactory:将每一个请求消息实体项目创建成DiskFileItem 实例

 // 设置缓冲区大小,默认10KB 超出将使用临时文件上传
     void setSizeThreshold(int sizeThreshold)

 //设置临时文件路径
     void setRepository(File repository)
 ServletFileUpload
:处理上传的文件数据

//设置总文件的大小
     public void setSizeMax(long sizeMax)

//设置单个文件的大小
     public void setFileSizeMax(long fileSizeMax)

//解析请求正文内容
     public List parseRequest(javax.servlet.http.HttpServletRequest req)

 //判断是form表单是否是multipart/form-data
     public static boolean isMultipartContent(HttpServletRequest req)

 FileItem:被处理的数据被封装成FileItem对象
     boolean  isFormField()//判断是否是普通字段
     String getName()//获取上传文件名
     String getFieldName()//获取普通字段的字段名
     String getString()//获取普通字段的值
     String getContentType() //获得文件类型
     InputStream  getInputStream()//以流的形式返回上传文件的主体内容
     void  delete()//删除临时文件
 

  1. 使用步骤:
  1. 执行很简单的3行语句
  2. 获取到一个集合(<FileItem>对象)

  解析请求数据,将每对分割线中间的内容封装到FileItem对象上

  1. 遍历集合

    【1】如果当前的FileItem对象是普通项

    将普通项上name属性的值作为键,将获取到的内容作为值,放入MAP中

     {username<==>tom,password<==>1234}

【2】如果当前的FileItem对象是上传项

     通过FileItem获取到输入流对象,通过输入流可以获取到文件二进制数据

     在服务端创建一个空文件(后缀必须和上传到服务端的文件名后缀一致)

     建立和空文件对应的输出流

     将输入流中的数据刷到输出流中

     释放资源

  向map中存入一个键值对的数据 userhead<===> /image/11.bmp

{username<==>tom,password<==>1234,userhead<===>image/11.bmp}

 

 public void uploadFiles(HttpServletRequest request,HttpServletResponse response) throws IOException {

      int i=0;

      Map<String,Object> map=new HashMap<String, Object>();

      String realPath=getServletContext().getRealPath("/Mytest");

        //  在服务端创建一个空文件(后缀必须和上传到服务端的文件名后缀一致)

         File uploadMkdir=new File(realPath);

         if(!uploadMkdir.exists()){

             uploadMkdir.mkdir();

         }

      try {

    //【1】以下三行代码功能:通过request.getInputStream();获取到请求体的全部内容

         //进行解析,将每对分割线中的内容封装在了FileItem对象中

          DiskFileItemFactory fac=new DiskFileItemFactory();

          int sizeThreshold=1024*1024*10; //10MB

         // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中 10M

          fac.setSizeThreshold(sizeThreshold);   

       //配置临时目录,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir 获取

         //Tomcat系统默认临时目录为“<tomcat安装目录>/temp/”

          fac.setRepository(new File(System.getProperty("java.io.tmpdir")));

         ServletFileUpload upload=new ServletFileUpload(fac);//文件上传解析器

         //设置编码,解决上传"文件名"的中文乱码

         upload.setHeaderEncoding("utf-8");

         //判断是form表单是否是multipart/form-data

          if(!ServletFileUpload.isMultipartContent(request)){

                 System.out.println("不是上传文件,终止");

                   //按照传统方式获取数据

                   return;

            }

         List<FileItem> list=upload.parseRequest(request);

       

         //【2】遍历集合

         for(FileItem item :list){

             i++;

            //1)如果当前FileItem对象是普通项

             if(item.isFormField()){

                //将普通项上name属性的值作为键,将获取到的内容作为值,放入MAP中

                 System.out.println(item.getString("utf-8")+"-------普通项");

                 System.out.println(item.getFieldName());

                 map.put(item.getFieldName(),item.getString()+"-------普通项");

             }else{

                 //1)如果当前FileItem对象是上传项

                 //如果fileitem中封装的是上传文件,得到上传的文件名称,       

                 String fileName = item.getName();//上传文件的名

                 //多个文件上传时,没有上传内容的问题 异常处理

                 if(fileName==null||"".equals(fileName.trim())){  //去空格是否为空

// 为空,跳过当次循环,  第一个没输入则跳过可以继续输入第二个

                 continue;             

}                 

    //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt

//处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")

                fileName = fileName.substring(fileName.lastIndexOf("\\")+1);

            //构建输入输出流

            // 通过FileItem获取到输入流对象,通过输入流可以获取到文件二进制数据

                 InputStream is=item.getInputStream();

                 File file=new File(realPath+"/"+fileName);

                      if(!file.isDirectory()){

                      map.put("fileUrl", realPath+"/"+item.getName());

                          map.put("fileSize", item.getSize());

                          map.put("fileExtension", item.getContentType());

                          map.put("fileDate", DateUtil.toGeTime(new Date()));

                          map.put("fileName", item.getName());

                         OutputStream os=new FileOutputStream(file);

                         //IOUtils拷贝流

                         IOUtils.copy(is, os);

                         //关闭资源

                         IOUtils.closeQuietly(is);

                         IOUtils.closeQuietly(os);

                         item.delete();//删除处理文件上传时生成的临时文件

                     }

                      UserSpace userspace=new UserSpace();

                      BeanUtils.populate(userspace, map); 

                } 

            }

    } catch (FileUploadException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

      catch (IllegalAccessException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

    } catch (InvocationTargetException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

    }

          response.getWriter().write(“上传成功”);

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值