• Apache Commons FileUpload框架的简介说明


    转自:

    Apache Commons FileUpload框架的简介说明

    下文笔者讲述Apache Commons FileUpload框架的功能简介说明,如下所示

    Apache Commons FileUpload简介

    Apache Commons是一个专注于可重用Java组件的所有方面的 Apache 项目。
    Apache Commons项目由三个部分组成:
    	Commons Proper - 可重用Java组件的存储库。
    	The Commons Sandbox - 用于Java组件开发的工作区。
    	The Commons Dormant - 当前不活动的组件存储库。
    	Commons-FileUpload是Commons Proper中的一个组件,该组件依赖于Commons-IO ,Commons-IO也是 Commons Proper中的一个组件。
    	Commons FileUpload的JAR包下载
    	Commons IO的JAR包下载
    
    实现思路:
        1.引入相应的jar包
        2.使用类中的相应的方法即可
    

    maven依赖

    
            
            
                commons-fileupload
                commons-fileupload
                1.3.1
            
            
            
                commons-io
                commons-io
                2.4
            
    

    前端界面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <% String path = request.getContextPath(); %>
    
    
    
    
    upload
    
    









    后台代码

    @RequestMapping(value="/uploadFile")
        public String uploadFile(final HttpServletRequest request, final HttpServletResponse response){         
        
            request.setAttribute("msg", "Not first time!");        
             //创建一个“硬盘文件条目工厂”对象
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //设置阈值,设置JVM一次能够处理的文件大小(默认吞吐量是10KB)
            factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);
            //设置临时文件的存储位置(文件大小大于吞吐量的话就必须设置这个值,比如文件大小:1GB ,一次吞吐量:1MB)
             factory.setRepository(new File("d:\\test"));
            //创建核心对象
             ServletFileUpload fileUpload = new ServletFileUpload(factory);
            //设置最大可支持的文件大小(10MB)
             fileUpload.setFileSizeMax(1024*1024*10);
            //设置转换时使用的字符集
             fileUpload.setHeaderEncoding("UTF-8");
             if(ServletFileUpload.isMultipartContent(request)){
                 try {
                    List fileItems = fileUpload.parseRequest(request);
                    for ( FileItem fileItem : fileItems) {
                        if(fileItem.isFormField()){//判断该FileItem为一个普通的form元素
                            //获取字段名
                            String fieldName = fileItem.getFieldName();
                            //获取字段值,并解决乱码
                            String fieldValue = fileItem.getString("UTF-8");
                            System.out.println(fieldName +" : " + fieldValue);
                            
                        }else{//判断该FileItem为一个文件
                            
                            System.out.println("Start to uplaod file!");
                            //获取文件名
                            String fileName = fileItem.getName();
                            System.out.println("fileName : " + fileName);
                            //获取文件大小
                            long fileSize = fileItem.getSize();
                            System.out.println("fileSize : " + fileSize);
                            
                            fileItem.write(new File("D://test//upload"+File.separator +fileName));
                        }
                    }
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }
            
        return "device/uploadFile";
        }
    

    异常处理

    catch(FileUploadBase.SizeLimitExceededException ex){
                    out.print("上传失败,文件太大,单个文件的最大限制是:"+upload.getSizeMax()+"bytes!");    
    }
    
    注意事项:
    1.流的操作,和File类的操作,mkdirs()和mkdir()的区别:
        都是用于创建文件夹的
        mkdirs:能创建多级目录
        mkdir:只能创建当前的文件夹
    
    2.上传文件名的乱码问题,
       如单表内容的乱码问题
       如上传文件同名问题
       如上传的文件很大
    
    3.上传文件名乱码问题
       使用servletFileUpload.setHeaderEncoding("UTF-8");
        或request.setCharacterEncoding("UTF-8")都可以
    
    4.表单内容乱码问题
       使用getString("utf-8") 
    
    5.避免同名问题:
       使用UUID.randomUUID().toString().replace("-", "")
       获得一个独一无二的32位数字
    
    6.使用FileUtils.copyInputStreamToFile(is, file);
       将内容输出到指定路径文件中去
       mkdirs() 自动创建目录 
    

                

    生成多级目录的示例

    public class StringUtils {
        /**
         * 生成二级目录
         * @param fileName  abc.txt
         * @return  /4/5
         */
        public static String getDir(String fileName) {
            //1 hashCode值
            int hashCode = fileName.hashCode();
            System.out.println(hashCode);
            //2 第一层 0xf表示15的16进制数。
            int dir1 = hashCode & 0xf;
            //3 第二层目录
            int dir2 = hashCode >>> 4 & 0xf;
            
            //4 拼写
            return "/" + dir1 + "/" + dir2;
        }
        
        public static void main(String[] args) {
            System.out.println(getDir("abc.txt"));
        }
    }
    
  • 相关阅读:
    Day4力扣打卡
    C++二分查找算法:数组中占绝大多数的元素
    Matlab:Matlab编程语言的简介、安装、学习路线(几十项代码编程案例分析)之详细攻略
    Playwright测试自动化工具
    Oracle(17)Managing Roles
    剑指offer97-100动态规划二维数组
    2022牛客多校(二)
    如何在centos服务器上远程配置jupyter
    Kotlin协程:挂起与恢复原理逆向刨析
    Python 文件处理指南:打开、读取、写入、追加、创建和删除文件
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127419991