文件上传

 

一、相关知识

a)         input type=“file”>标签用于在web页面中添加文件上传输入项,设置文件上传输入项时须注意:

                        i.              必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。

                      ii.              必须把form的enctype属值设为multipart/form-data.设置该值后

b)        在servlet中读取文件上传数据

                        i.              Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。

c)         DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:

                        i.              public void setSizeThreshold(int sizeThreshold) :设置内存缓冲区的大小,默认值为10K。

                      ii.              public void setRepository(java.io.File repository) :指定临时文件目录

d)        ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法:

                        i.              boolean isMultipartContent(HttpServletRequest request) :判断上传表单是否为multipart/form-data类型

                      ii.              List parseRequest(HttpServletRequest request):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

                    iii.              setFileSizeMax(long fileSizeMax) :设置上传文件的最大值

                     iv.              setSizeMax(long sizeMax) :设置上传文件总量的最大值

                       v.              setHeaderEncoding(java.lang.String encoding) :设置编码格式

setProgressListener(ProgressListener pListener)

二、实现步骤:

a)         创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录

b)        2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,

c)         调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象

d)        对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件

                        i.              为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值

                      ii.              为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。

三、代码:

a)         Jsp代码

<body>

   <form action="${pageContext.request.contextPath}/servlet/UploadServlet"method="post" enctype="multipart/form-date">

    上传用户:<input type="text" name="user"/><br/>

    上传文件:<input type="file" name="file1"/><br/>

    上传文件:<input type="file" name="file2"/><br/>

    <input type="submit" value="上传文件"/>

 

   </form>

  </body>

b)Servlet代码

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //文件上传

      

       try {

           //(1)创建一个解析器工厂---FileItem对象

           DiskFileItemFactory factory=new DiskFileItemFactory();

           //(2)得到解析器

           ServletFileUpload upload=new ServletFileUpload(factory);

           upload.setHeaderEncoding("utf-8");

           //(3)对请求进行解析,有几个输入项,就会解析几个FileItem对象

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

           //(4)迭代list集合,对里边的每一个输入想进行处理(获取每一个输入项)

           for(FileItem item:list){

              //(5)判断输入的类型

              if(item.isFormField()){

                  //普通输入项

                  String inputName=item.getFieldName();

                  String inputValue=item.getString();

                  System.out.println(inputName+"  "+inputValue);

                  //普通的输入有乱码如何解决

                 

              }else{

                  //上传文件的输入项

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

                  filename=filename.substring(filename.lastIndexOf("\\")+1);//获取文件名(不包括路径)

                  InputStream is=item.getInputStream();

                  FileOutputStream fos=new FileOutputStream("E:"+filename);

                  byte[] buff=new byte[1024];

                  int len=0;

                  while((len=is.read(buff))>0){

                     fos.write(buff,0,len);

                  }

                  is.close();

                  fos.close();

              }

           }

           request.setAttribute("message", "上传成功");

       } catch (FileUploadException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

           request.setAttribute("message","上传失败");

       }

       request.getRequestDispatcher("/message.jsp").forward(request, response);

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值