• FileUpload




    用request.getParameter("file")方法只能得到字符串,不管是否文件类型

    form-data表单不能用普通方法获取,它是二进制封装,需要字节流操作,太过复杂,所以使用下面的封装jar包


    需要的jar包

    • commons-io
    • Commons-fileupload

    //检查我们是否表单类型
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    
    //1为基于磁盘的文件项创建工厂
    DiskFileItemFactory factory = new DiskFileItemFactory();
    
    //为基于磁盘的文件项创建工厂
    DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize,yourTempDirectory);
    //设置工厂约束
    //配置临时目录
    ServletContext servletContext = this.getServletContext();
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
    factory.setRepository(repository);
    
    //2创建一个新的文件上传处理程序
    ServletFileUpload upload = new ServletFileUpload(factory);
    //设置upload的编码
    upload.setHeaderEncoding("UTF-8");
    
    //3解析请求
    List <FileItem>items = upload.parseRequest(request);
    
    //处理上传的项目,迭代器
    //Iterator <FileItem> iter = items.iterator(); 
    
    for(FileItem item : items){ 
    	//普通表单
        if(item.isFormField()){ 
            String name = item.getFieldName();
        	String value = item.getString("UTF-8");
        } else { 
            //得到上传文件名
            String filename = item.getName();
            filename = filename.substring(filename.lastIndexOf("\")+1);
            //文件名:E:DataHowling	est.png
            
            //字节输入流
            InputStream in = item.getInputStream();
            
            //字节输出流
            String savepath = this.getServletContext().getRealPath("/upload");
            File file = new File(savepath + "\" + filename);
            
            //扩展:这里可以用打散的文件
            FileOutputStream out = new FileOutputStream(file);
            
            int length = 0;
            byte[] bytes = new byte[1024];
            
            while(  (length = in.read(bytes)) != 1  ){
                out.write(bytes,0,length);
            }
            
            //删除临时文件,当大于设置大小时
            item.delete();
            in.close();
            out.close();
        } 
    }
    
    
    //String	substring(int beginIndex)
    //返回一个字符串,该字符串是此字符串的子字符串。
    
    //int	lastIndexOf(String str)
    //返回指定子字符串最后一次出现的字符串中的索引。
    

    form-data数据进行了二进制封装,所以使用request编码也无用



    打散文件夹

    • 低四位生成一级目录
    • 5-8位生成二级目录
    private String makeDirPath(String fileName, String savepath) {
    
      //通过文件名来算出一级目录和二级目录
      int hashCode = fileName.hashCode();
      int dir1 = hashCode & 0xf;
      int dir2 = (hashCode & 0xf0) >> 4;
    
      String dir = savepath + "\" + dir1 + "\" + dir2;
    
      //如果该目录不存在,就创建目录
      File file = new File(dir);
      if (!file.exists()) {
    
        file.mkdirs();
      }
      //返回全路径
      return dir;
    }
    

    获取全部文件

    private void getAllFiles(File filePath, Map map) {
    
        if(!filePath.isFile()){
            File[] files = filePath.listFiles();
            for(File file = files){
                getAllFiles(file,map);
            }
        }else{
            String filePath = filePath.getName();
            String fileName = filePath.substring(filePath.lastIndexOf("\") + 1);
            map.add(filePath,fileName);
        }
    }
    



    参考Apache

    参考Java3y


  • 相关阅读:
    Django开发个人博客网站
    Photoshop界面字体太小解决方案
    [Leetcode]第三题:无重复字符最长子串
    web网站服务(1)
    备份与恢复笔记和实验
    oracle事物和常用数据库对象笔记和实验
    Oracle配置管理实验
    Oracle配置管理笔记
    Oracle体系结构和用户管理实验
    Oracle数据库部署
  • 原文地址:https://www.cnblogs.com/Howlet/p/12057441.html
Copyright © 2020-2023  润新知