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 items = upload.parseRequest(request);

//处理上传的项目,迭代器
//Iterator  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:\Data\Howl\bing\test.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




你可能感兴趣的:(FileUpload)