Java中使用FIleUpload实现文件的上传操作

3 篇文章 0 订阅

文件上传就是将本地文件写到服务器上

使用Servlet3.0新特性完成文件的上传【开发中通常使用FileUpload完成文件的上传】

文件上传使用的的方法【技术】:

  • Servlet3.0: 注解式开发
  • JSPSmartUpload:嵌入到JSP中完成文件上传。主要用于Model1年代的
  • FIleUpload : Apache的文件上传组件。
  • Strus2 : 底层是FileUpload

文件上传的三要素

  • ​ 表单的提交方式必须是POST

  • ​ 表单中需要有文件上传的表单要素:

    • ​ name属性和值:
  • ​ 表单中的encype属性值必须是multipart/form-data【因为文件上传需要的是二进制,默认的是非文件类型的数据,不会文件中的数据,只会有文件名】通过设置属性就能获得文件名和问价类容

  • 文件上传的原理:

    开发中直接使用框架

文件上传中会遇到的问题:

  1. 文件重名:

    ​ 解决方法:在文件名前面添加一个UUID值

  2. 一个目录下存放过多的文件

    ​ 解决方法:根据文件的类型来创建目录:文件的类型、文件的后缀名、时间分、用户分、数量分等。。。。。。。。

    目录分离算法:**按位与运算

    使用唯一文件名.hashCode(); – 得到一个代表当前这个文件的 int*类型值.**

    * int**类型占4****个字节32****位.*可以让hashCode*值&0xf;* 得到一个int*值,*用这个int*值作为一级目录.**

    让hashCode*右移4****位 &0xf ;*得到一个int*值,*用这个int*值作为二级目**

    /*录.*依次类推.**

使用FileUpload实现文件的上传

步骤分析:

  • 创建文件的工厂对象

  • 得到解析器

  • 解析request,获取所有的输入项对象

  • 遍历集合

    • 判断输入项是普通输入项还是文件的输入项
    • 普通项:普通项目的API
    • 文件项:文件名称和文件的输入流
  • 完成流的对接

  • 代码实现

    • Java
      try {
      //1.创建文件工厂对象
      DiskFileItemFactory ds = new DiskFileItemFactory();
      //2.得到解析器对象
      ServletFileUpload sf = new ServletFileUpload(ds);
      //3.解析request,得到所有输入项对象
      List<FileItem> list = sf.parseRequest(request);
      //4.遍历集合
      for (FileItem fileItem : list) {
      boolean flag = fileItem.isFormField();
      //System.out.println(flag);
      if(flag==true){//普通项
      String fieldName = fileItem.getFieldName();
      String value= fileItem.getString("utf-8");
      System.out.println(fieldName+"::"+value);
      }else{
      String fileName = fileItem.getName();//获取文件的名称
      //System.out.println(fileName);
      InputStream in = fileItem.getInputStream();//获取文件的字节输入流
      //获取服务器端的路径
      String path = this.getServletContext().getRealPath("/upload");
      //String a="path";
      OutputStream out = new FileOutputStream(path+"/"+fileName);
      //流的对接
      int len=0;
      byte[] b = new byte[1024];
      while((len=in.read(b))!=-1){
      out.write(b, 0, len);
      }
      out.close();
      in.close();
      }
      }
      } catch (FileUploadException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值