Struts 2 <s:file>标签上传GB级别文件或多文件

struts.xml配置:

<constant name="struts.multipart.maxSize" value="4096000000" />
上面这个全局配置,也需要设置,默认是2M,必须也改成允许上传的文件大小


对于文件类型的过滤,优先级allowedTypes大于allowedExtensions,2种方法都可行,后者比较方便,配置了后者最好就不要使用前者了,因为优先级的原因会致其无效。

<!-- Application Library Manage Start -->
<action name="uploadactions" class="appLibraryAction"
method="upload">
<!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<!-- 允许后缀名为png,bmp,jpg,doc,xls的文件上传 -->     
               <param name="allowedExtensions">  
                 png,bmp,jpg,ipa,apk,mkv,exe,zip,rar,iso
                </param>  
<!-- 
<param name="allowedTypes">
image/bmp,image/png,image/gif,image/jpeg,image/pjpeg,image/jpg,application/msword,text/plain
</param>
-->
<!-- 配置允许上传的文件大小 -->
<!-- <param name="maximumSize">2000000000</param> -->
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result>/taguser/fileuploadoutput.jsp</result>
<result name="input">/taguser/fileuploads.jsp</result>
</action>

JSP页面:
<s:form action="uploadactions"  method="post" enctype="multipart/form-data">
     <s:file name="upload" label="path"/>
     <s:file name="upload" label="path"/>
     <s:file name="upload" label="path"/>
     <s:submit value="upload"/>
 </s:form>

action方法:

   //封装多个上传文件域的属性   
    private List<File> upload = new ArrayList<File>();   
    // 封装多个上传文件类型的属性   
    private List<String> uploadContentType = new ArrayList<String>();   
    // 封装多个上传文件名的属性   
    private List<String> uploadFileName = new ArrayList<String>();   
       
    //动态设置上传文件保存地址   
    private String savePath;   
       
    public String getSavePath() { 
     System.out.println("getSavePath()!!!!!");
     
     System.out.println(savePath+"++++++++++++++++++++++++++++++");
        return savePath;   
    }   
  
    public void setSavePath(String savePath) {
     System.out.println("setSavePath()!!!!!");
        this.savePath = savePath;
       // savePath = "E:\\butone\\struts2.2\\WebRoot\\images\\"+getUploadFileName();
    }     
  
    //上传多个文件对应文件内容的setter和getter方法   
    public List<File> getUpload() {   
        return upload;   
    }   
    public void setUpload(List<File> upload) { 
     System.out.println("----------------    setUpload(List<File> upload)     ----------------");
        this.upload = upload;   
    }   
       
    //  上传多个文件的文件类型setter和getter方法    
    public List<String> getUploadContentType() {   
        return uploadContentType;   
    }   
    public void setUploadContentType(List<String> uploadContentType) {   
        this.uploadContentType = uploadContentType;   
    }   
  
    // 上传多个文件的文件名的setter和getter方法    
    public List<String> getUploadFileName() {   
        return uploadFileName;   
    }   
    public void setUploadFileName(List<String> uploadFileName) {   
        this.uploadFileName = uploadFileName;   
    }   
  
    public String upload() {   
     
     //savePath = "E:\\butone\\struts2.2\\WebRoot\\images\\";
     savePath = ServletActionContext.getRequest().getRealPath("");
     
     System.out.println("upload()!!!!!");
        //上传多个文件   
        List<File> files = getUpload();   
        // String ext ="";   
        FileOutputStream fos = null;   
        FileInputStream fis = null;   
        byte[] buffer = new byte[1024];   
        int len = 0;   
        Random rd = new Random();   
        System.out.println(files.size()+"               ----------------");
        System.out.println(getSavePath());
        for (int i = 0; i < files.size(); i++) {   
            try {   
                //以服务器的文件保存地址和当前时间组合文件名建立上传文件输出流   
                // ext =uploadFileName.get(i).substring(uploadFileName.get(i).lastIndexOf('.'));   
                 /* fos = new FileOutputStream(getSavePath()+ File.separator+  
                 * DateFormatUtil.getCurrentCustomFormatDateTime(DateFormatUtil.DATE_TIME_FORMAT_14) + 
                 * String.valueOf(rd.nextInt(1000))+ext);  
                 */  
             System.out.println(getSavePath()+"------------------------getsavepath!!!");
                fos = new FileOutputStream(getSavePath() + File.separator + uploadFileName.get(i));   
                // 以上传文件建立一个文件上传流   
                fis = new FileInputStream(files.get(i));   
                // 将上传文件的内容写入服务器   
                len = 0;   
                while ((len = fis.read(buffer)) > 0) {   
                    fos.write(buffer, 0, len);   
                }   
            } catch (Exception e) {   
                e.printStackTrace();   
            }   
        }   
         return SUCCESS;   
    }   

最后,上传过程中,可能会遇到read time out错误。原因是web容器的配置问题,以tomcat为例,需要修改tomcat的server.xml

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" disableUploadTimeout="false"/>
<!--这里就添加了 disableUploadTimeout="false"一般默认情况下disableUploadTimeout的值为true-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值