Jfinal上传超大文件,绕过me.setMaxPostSize(int)

直接上代码:

try{
    //request获取的参数map
    Map<String , String> paramMap = new HashMap<String, String>();
    HttpServletRequest request = this.getRequest();
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setHeaderEncoding("UTF-8");
    //临时存放目录
    String tempPath = request.getServletContext().getRealPath("/upload");
    List<String> tempFileSavePath = new ArrayList<String>();//临时文件存放的硬盘绝对目录列表(考虑到可能上传多个文件)
    List<FileItem> items = upload.parseRequest(request);
    for(FileItem item:items){
        //如果fileitem中封装的是普通输入项的数据(输出名:值)
        if(item.isFormField()){
            String filedName = item.getFieldName();//普通输入项数据的名
            //解决普通输入项的数据的中文乱码问题
            String filedValue = item.getString("UTF-8");//普通输入项的值
            paramMap.put(filedName, filedValue);
        }else{
            //如果fileitem中封装的是上传文件,得到上传的文件名称,
            String fileName = item.getName();//上传文件的名
            //多个文件上传输入框有空的异常处理
            if(fileName == null||"".equals(fileName.trim())){  //去空格是否为空
                continue;// 为空,跳过当次循环,  第一个没输入则跳过可以继续输入第二个
            }
            //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
            //处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")
            fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
            //拼接上传路径。存放路径+上传的文件名
            tempPath = tempPath+"\\"+fileName;
            //构建输入输出流
            InputStream in = item.getInputStream(); //获取item中的上传文件的输入流
            OutputStream out = new FileOutputStream(tempPath); //创建一个文件输出流
            //创建一个缓冲区
            byte b[] = new byte[1024];
            //判断输入流中的数据是否已经读完的标识
            int len = -1;
            //循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
            while((len=in.read(b))!=-1){  //没数据了返回-1
                //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
                out.write(b, 0, len);
            }
            //关闭流
            out.close();
            in.close();
            //删除临时文件
            Thread.sleep(1000);
            item.delete();//删除处理文件上传时生成的临时文件(xxx.tmp文件)
            tempFileSavePath.add(tempPath);
        }
    }
}catch(Exception e) {
    e.printStackTrace();
}


评论区

JFinal

2020-10-28 22:33

这个直接在 controller 中就可以使用,可以接管 jfinal 的 getFile() 对于个性化场景很有用,谢谢分享

热门分享

扫码入社