zoukankan      html  css  js  c++  java
  • Servlet上传文件

      1 package pageckage;
      2 
      3 
      4 
      5     import java.io.File;
      6     import java.io.*;
      7     import java.io.IOException;
      8     import java.io.PrintWriter;
      9     import java.util.List;
     10 
     11     import javax.servlet.ServletException;
     12     import javax.servlet.http.HttpServlet;
     13     import javax.servlet.http.HttpServletRequest;
     14     import javax.servlet.http.HttpServletResponse;
     15 
     16     import org.apache.commons.fileupload.FileItem;
     17     import org.apache.commons.fileupload.FileUploadException;
     18     import org.apache.commons.fileupload.disk.DiskFileItemFactory;
     19     import org.apache.commons.fileupload.servlet.ServletFileUpload;
     20 
     21     /**
     22      * 
     23      * @author Administrator
     24      * 文件上传
     25      * 具体步骤:
     26      * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
     27      * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
     28      * 3)对 DiskFileItemFactory 对象设置一些 属性
     29      * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory);
     30      * 目的是调用 parseRequest(request)方法  获得 FileItem 集合list ,
     31      *     
     32      * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理
     33      * 6)
     34      *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上
     35      *    第二种. 手动处理  
     36      *
     37      */
     38     
     39     
     40     /**
     41      *     jsp  页面代码
     42      <!-- enctype 默认是 application/x-www-form-urlencoded -->  
     43      <form action="FileUpLoad" enctype="multipart/form-data" method="post" >  
     44           
     45                用户名:<input type="text" name="usename"> <br/>  
     46                上传文件:<input type="file" name="file1"><br/>  
     47               上传文件: <input type="file" name="file2"><br/>  
     48               <input type="submit" value="提交"/>  
     49        
     50      </form>  
     51       
     52      */
     53     
     54     
     55     
     56     public class UploadServlet extends HttpServlet {
     57 
     58         public void doPost(HttpServletRequest request, HttpServletResponse response)
     59                 throws ServletException, IOException {
     60             
     61             request.setCharacterEncoding("utf-8");    //设置编码
     62             
     63             //获得磁盘文件条目工厂
     64             DiskFileItemFactory factory = new DiskFileItemFactory();
     65             //获取文件需要上传到的路径
     66             String path = request.getRealPath("/upload");
     67             
     68             //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
     69             //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
     70             /**
     71              * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 
     72              * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 
     73              * 然后再将其真正写到 对应目录的硬盘上
     74              */
     75             factory.setRepository(new File(path));
     76             //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
     77             factory.setSizeThreshold(1024*1024) ;
     78             
     79             //高水平的API文件上传处理
     80             ServletFileUpload upload = new ServletFileUpload(factory);
     81             
     82             
     83             try {
     84                 //可以上传多个文件
     85                 List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
     86                 
     87                 for(FileItem item : list)
     88                 {
     89                     //获取表单的属性名字
     90                     String name = item.getFieldName();
     91                     
     92                     //如果获取的 表单信息是普通的 文本 信息
     93                     if(item.isFormField())
     94                     {                    
     95                         //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
     96                         String value = item.getString() ;
     97                         
     98                         request.setAttribute(name, value);
     99                     }
    100                     //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
    101                     else
    102                     {
    103                         /**
    104                          * 以下三步,主要获取 上传文件的名字
    105                          */
    106                         //获取路径名
    107                         String value = item.getName() ;
    108                         //索引到最后一个反斜杠
    109                         int start = value.lastIndexOf("\");
    110                         //截取 上传文件的 字符串名字,加1是 去掉反斜杠,
    111                         String filename = value.substring(start+1);
    112                         
    113                         request.setAttribute(name, filename);
    114                         
    115                         //真正写到磁盘上
    116                         //它抛出的异常 用exception 捕捉
    117                         
    118                         //item.write( new File(path,filename) );//第三方提供的
    119                         
    120                         //手动写的
    121                         OutputStream out = new FileOutputStream(new File(path,filename));
    122                         
    123                         InputStream in = item.getInputStream() ;
    124                         
    125                         int length = 0 ;
    126                         byte [] buf = new byte[1024] ;
    127                         
    128                         System.out.println("获取上传文件的总共的容量:"+item.getSize());
    129 
    130                         // in.read(buf) 每次读到的数据存放在   buf 数组中
    131                         while( (length = in.read(buf) ) != -1)
    132                         {
    133                             //在   buf 数组中 取出数据 写到 (输出流)磁盘上
    134                             out.write(buf, 0, length);
    135                             
    136                         }
    137                         
    138                         in.close();
    139                         out.close();
    140                     }
    141                 }
    142                 
    143                 
    144                 
    145             } catch (FileUploadException e) {
    146                 // TODO Auto-generated catch block
    147                 e.printStackTrace();
    148             }
    149             catch (Exception e) {
    150                 // TODO Auto-generated catch block
    151                 
    152                 //e.printStackTrace();
    153             }
    154             
    155             
    156             request.getRequestDispatcher("filedemo.jsp").forward(request, response);
    157             
    158 
    159         }
    160 
    161     }
  • 相关阅读:
    博客搬迁
    Android 集成FaceBook实现第三方登陆
    android-Xfermode模式详解
    android FileNotFoundException
    EditText 隐藏或者显示输入内容
    Fragment+ViewPager静止滑动,去掉默认的滑动效果
    Xcode 常用插件(持久更新)
    XMPP- JID 与 XMPP的命名空间
    android openfire 和 xmpp
    IOS-数据持久化的几种方式
  • 原文地址:https://www.cnblogs.com/zfy0098/p/5308873.html
Copyright © 2011-2022 走看看