多部件文件上传

    form表单文件上传三要素:

【post提交、type="file"enctype="multipart/form-data"】

a.method="post"

b.必须有上传组件  <inputtype="file"/>【显示文件上传浏览的入口】

c.必须是上传表单  <form enctype="multipart/form-data">【多部件:将整个表单进行了一个拆分操作,以写的表单输入项;区分普通项和文件上传项】

enctype两种属性的区别:

区别一:

默认的是:application/x-www-form-urlencoded:它只上传名字,不带内容

multipart/form-data :带内容。

区别二、

   application/x-www-form-urlencoded:获取的数据是一个整体(字符串)request.getParameter();//返回值是一个String

    multipart/form-data 它是一个多部件的类型 ( 字节的 )


文件上传使用工具:

文件上传需要导入2个jar包

(commons-fileupload-1.2.1.jar和commons-io-1.4.jar)

    a.创建磁盘文件工厂(DiskFileItemFactory)

    b.创建上传组件核心类(ServletFileUpload)用来解析request的字节流

    c.用核心类解析request的字节流(把字节流分隔并封装成了多个对象,一个对象封装着一个表单输入项的信息)

 

//1.创建磁盘文件工厂(DiskFileItemFactory)

DiskFileItemFactory factory = new DiskFileItemFactory();

//2.创建上传组件核心类(ServletFileUpload)用来解析request的字节流

ServletFileUpload upload = new ServletFileUpload(factory);

//3.用核心类解析request的字节流(把字节流分隔并封装成了多个对象,一个对象封装着一个表单输入项的信息)

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

FileItem:

isFormField();返回boolean。  普通表单项:true      上传表单项:false

    普通表单项type!="file"

    上传表单项type="file"

getFieldName();返回String,返回的是表单输入项name属性

getString(Stringencoding);   返回String,只返回普通表单项的参数值

 encoding是编码,例如:fi.getString("utf-8");

getInputStream();返回的是inputStream,只返回上传项的文件内容

delete(); 会删除上传产生的临时文件。

getName(); 返回值是String,返回的是上传组件的  文件名

           火狐浏览器  文件名是   文件名.扩展名

           IE和一部分的浏览器  文件名是  绝对路径+文件名.扩展名


//0.将获取所有的数据保存到一个Map中

    Map<String,Object> map = newHashMap<>();

    //1.创建磁盘文件工厂(DiskFileItemFactory)

    DiskFileItemFactory factory = new DiskFileItemFactory();

    //设置缓存大小,如果文件的大小超过了缓冲区的大小,就会产生临时文件

    //factory.setSizeThreshold(10*1024*1024);

    //2.创建上传组件核心类(ServletFileUpload)用来解析request的字节流

    ServletFileUpload upload = new ServletFileUpload(factory);

    //解决中文文件名上传编码问题

    upload.setHeaderEncoding("utf-8");

    //3.用核心类解析request的字节流(把字节流分隔并封装成了多个对象,一个对象封装着一个表单输入项的信息)

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

    //System.out.println(list.size());

    String fileName = null;

    //4.遍历

    for (FileItem fileItem : list) {

       if(fileItem.isFormField()){

           //普通

           map.put(fileItem.getFieldName(),fileItem.getString("utf-8"));

       }else{

           //上传项

           //6.获得文件要上传的路径

           String realPath =request.getServletContext().getRealPath("/user/info");

           System.out.println(realPath);

           //7.获得要上传文件的名字

           fileName = fileItem.getName();

           System.out.println(fileName);//1.jpg

           //8.获得文件的输入流

           InputStream inputStream =fileItem.getInputStream();

           //9.获得输出流

           OutputStream outputStream= new FileOutputStream(realPath+"/"+fileName);

           //10.流对拷

           IOUtils.copy(inputStream,outputStream);

           //11.关闭流资源

           inputStream.close();

           outputStream.close();

// BeanUtils.populate(user,map);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值