struts文件上传详解

第一步:添加配置文件

      在struts.xml文件中添加如下内容:

      <constant name="struts.multipart.saveDir" value="/tmp"/>     --------------》这个用于存放临时文件


      <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
      name="myRequestParser" class="com.base.wrapper.RequestParseWrapper"   -----------》这个类没有实际作用,见第二步
      scope="default" optional="true" />
     <constant name="struts.multipart.handler" value="myRequestParser" />

第二步:创建RequestParseWrapper类

      这个类对应struts.xml文件 ,在com.base.wrapper包下(包按自己需求创建)创建该类就行了,不需要在该类中做任何操作

     public class RequestParseWrapper extends JakartaMultiPartRequest {  

      public void parse(HttpServletRequest servletRequest, String saveDir)throws IOException
        {
          
       }  
     }

第三步:创建文件上传实体类

      创建文件上传实体类

      简单介绍该类:该类根据自己的业务需要,在指定的文件夹(根目录)下,把每天上传的重新命名的文件放在单独的文件夹(文件夹的名字是今天的日期yyyymmdd)下,

      其中可能涉及自己写的一些工具方法,这些方法主要是关于文件路径创建的,可以跳过,但不影响文章的阅读。该类把上传文件的原来的名字和处理后的名字封装

    成了该类的属性,方便使用。该类完全支持多文件上传,但需要把该类的属性改成list集合,具体操作,你懂得

      public class FileUploadModel {
    @SuppressWarnings("unchecked")
    public void fileUpload() throws Exception{
        try {
            //获取文件的跟路径
            String uploadDir = ResourceConfig.getSysUploadWebPath();
            //前缀  文件夹
            String prefix = TimeUtil.nowDate();
            //存放文件的临时文件夹
            String tempDir = uploadDir + prefix +"\\";
            File fileDir = new File(tempDir);
            if(!fileDir.exists()){
                fileDir.mkdir();
            }
            // 磁盘文件项工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // threshold 极限、临界值,即硬盘缓存 1M  达到1M后flush
            factory.setSizeThreshold(1024 * 1024);  
            // repository 贮藏室,即临时文件目录  
            factory.setRepository(new File(tempDir));
            //文件上传核心类
            ServletFileUpload upload = new ServletFileUpload(factory);  
            // 设置允许上传的最大文件大小 20M  
            upload.setSizeMax(20 * 1024 * 1024);
            
            HttpServletRequest request = ServletActionContext.getRequest();
            // 解析HTTP请求消息头  
            List<FileItem> fileItems = upload.parseRequest(request);
            log.info("length:"+fileItems.size());
            Iterator<FileItem> iter = fileItems.iterator();  
            while(iter.hasNext()) {  
                FileItem item = (FileItem)iter.next();  
                if(!item.isFormField()) {  
                    log.info("处理上传的文件 ...");  
                    // 此时的文件名包含了完整的路径,得注意加工一下  
                    filename = item.getName();         
                    //上传文件的大小
                    long fileSize = item.getSize();
                    if("".equals(filename) && fileSize == 0){
                        log.info("获取文件名失败,文件名为空...");
                        return;
                    }else if (fileSize > 20 * 1024 * 1024){
                        // 如果上传的软件超过20M
                        log.info("文件保存失败,上传文件过大,请控制在20M以内");    
                        return;
                    }
                    log.info("完整的文件名:" + filename);
                    //文件名
                    String suffix = TimeUtil.now() + "_" + RandomUtil.randomAlphabetic(4);
                    // 文件扩展名
                    String nameExt = "";
                    // 获取扩展名即获取文件的格式
                    nameExt = FileNameUtil.getNameExt(item.getName());;  
                    //处理后的完整的文件名
                    String tmpPath = tempDir + suffix + "." + nameExt;
                    proFileName = proFileName+prefix +"\\"+ suffix + "." + nameExt;
                    File uploadFile = new File(tmpPath);
                    if(!uploadFile.exists()){
                        uploadFile.createNewFile();
                    }
                    //将上传的文件写到指定的文件中
                    item.write(uploadFile);
                    log.info("文件保存完毕");
                }else{
                    String name = item.getFieldName();  
                    String value = item.getString();
                    log.info("表单....."+name+"="+value);
                }
             }
        } catch (Exception e) {
            log.info("上传文件发生异常 ...");
            e.printStackTrace();
            throw e;
        }  
    }
    
    //日志跟踪
    private Logger log = Logger.getLogger(FileUploadModel.class);
    
    //处理后的完整的文件名
    private String proFileName = "\\";
    
    //上传文件的完整文件名
    private String filename = "";
   

    get/set方法............
}


第四步:调用上传类

     在需求的action对应的方法中调用

     FileUploadModel upload = new FileUploadModel();

     upload.fileUpload();
     String fileName = upload.getFilename();//文件原来的名字
     String proFileName = upload.getProFileName();//文件处理后的完整路径和名字


第五步:jsp文件的处理

     <form name="" action="" method="post" enctype="multipart/form-data" target="targetFrame">

       <input type="file" name="abcc"> ------->name一定要有值

    </form>

    <iframe name="targetFrame" style="width:0%;display: none;;"></iframe>  ----------->可以理解为伪ajax异步刷新



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值