A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© hejinzhong 中级黑马   /  2014-9-12 21:18  /  889 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. public class FileLoad extends HttpServlet {

  2.         public void doGet(HttpServletRequest request, HttpServletResponse response)
  3.                         throws ServletException, IOException {
  4.                 doPost(request, response);
  5.         }

  6.         public void doPost(HttpServletRequest request, HttpServletResponse response)
  7.                         throws ServletException, IOException {
  8.                
  9.                 //先判断是否是上传操作----------#1
  10.                 if(!ServletFileUpload.isMultipartContent(request)){
  11.                         throw new RuntimeException("非上传操作");
  12.                 }
  13.                
  14.                 try {
  15.                 //----------------------------------------------------------------------
  16.                 //建立一个工厂,并设置参数(文件位置和是否缓存)
  17.                 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
  18.                
  19.                 //设置文件大于6M则进行缓存
  20.                 diskFileItemFactory.setSizeThreshold(1024*1024*6);
  21.                
  22.                 /*
  23.                  *这个是返回该文件在服务器中的实际路径,其中/是指当前项目路径。
  24.                  *目的:建立一个临时文件夹
  25.                  */
  26.                 File tempFile = new File(this.getServletContext().getRealPath("/temp"));
  27.                 if(!tempFile.exists()){
  28.                         tempFile.mkdir();
  29.                 }
  30.                 //设置的是上传过程中临时文件存放位置
  31.                 diskFileItemFactory.setRepository(tempFile);               
  32.                
  33.                 //----------------------------------------------------------------------
  34.                
  35.                
  36.                 //建立核心类,将工厂传进去
  37.                 ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
  38.                
  39.                 //设置FileItem头中编码方式,上传文件名
  40.                 servletFileUpload.setHeaderEncoding("UTF-8");
  41.                 //开始解析
  42.                 List<FileItem> parseRequest = servletFileUpload.parseRequest(request);
  43.                
  44.                 //处理解析结果
  45.                 for (FileItem fileItem : parseRequest) {
  46.                        
  47.                         if(fileItem.isFormField()){
  48.                                 System.out.println(fileItem.getName()+":"+fileItem.getString("UTF-8"));
  49.                         }else{
  50.                                 /*
  51.                                  * 获取上传的名,并作处理
  52.                                  * 由于不同的浏览且传送过来的路径方式不同
  53.                                  */
  54.                                 String fileName = fileItem.getName();
  55.                                 fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
  56.                                
  57.                                 //目录分级处理(工具类)
  58.                                 String subDir = DirUtils.getSubDir(fileName);

  59.                                 //得到文件存储的位置
  60.                                 File fileDir = new File(this.getServletContext().getRealPath("/WEB-INF/upload"),subDir);
  61.                                 if( ! fileDir.exists()){
  62.                                         fileDir.mkdirs();//这里创建多级目录
  63.                                 }
  64.                                 //获取流,将其内容写去文件中,
  65.                                 FileUtils.copyInputStreamToFile(fileItem.getInputStream(), new File(fileDir,fileName));
  66.                                 fileItem.delete();
  67.                         }
  68.                 }
  69.                 } catch (FileUploadException e) {
  70.                         throw new RuntimeException(e);
  71.                 }
  72.         }
  73. }

  74. class DirUtils{
  75.        
  76.         //根据哈希值对文件进行目录的分级
  77.         public static String getSubDir(String fileName){
  78.                
  79.                 int fileCode = fileName.hashCode();
  80.                 //哈希值最后四位大小
  81.                 int fir = fileCode & 0xf;       
  82.                 //次后4位的值
  83.                 int sec = fileCode>>>4 &0xf;
  84.                 return "/"+fir+"/"+sec;
  85.         }
  86. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马