您的位置:首页 > 编程语言 > Java开发

Struts文件上传allowedTypes问题,烦人的“允许上传的文件类型”

2016-09-15 10:25 435 查看


Struts文件上传allowedTypes问题,烦人的“允许上传的文件类型”

Struts的文件上传问题,相信很多人都会使用allowedTypes参数来配置允许上传的文件类型,如下。

[html] view
plain copy

<param name="allowedTypes">  

    image/png,image/bmp,image/jpg  

</param>  

但是,用过这个参数的人都知道,allowedTypes是“文件类型”, 而不是“文件后缀名”,文件类型与文件后缀名有什么区别呢?

就如后缀名为bmp的图片的文件类型为image/bmp,后缀名为xls的Excel文件类型为application/vnd.ms-excel等等....

这各种各样的”文件类型“,让人烦不胜烦。。。。

猜想是否可以根据后缀名来过滤允许上次的文件,Struts如此红火的框架应该能想到这点。

于是便打开Struts文件上次的拦截器org.apache.struts2.interceptor.FileUploadInterceptor一看,发现如下代码:

[java] view
plain copy

protected Set<String> allowedTypesSet = Collections.emptySet();  

protected Set<String> allowedExtensionsSet = Collections.emptySet();  

看到一个allowedTypesSet和一个allowedExtensionsSet,很容易想到,前者是用于存放参数allowedTypes的,

而后者呢,自然是用于存放参数allowedExtensions的,extension翻为:延长、扩展...

所以,我们可以大胆的猜想,allowedExtensions参数就是用于配置”允许上传的文件后缀名“。

再来看看FileUploadInterceptor里的一个方法acceptFile(),此方法用于根据当前配置,检查该文件是否允许被上传

[java] view
plain copy

protected boolean acceptFile(Object action, File file, String filename, String contentType, String inputName, ValidationAware validation, Locale locale) {  

    boolean fileIsAcceptable = false;  

  

    // If it's null the upload failed  

    if (file == null) {  

        String errMsg = getTextMessage(action, "struts.messages.error.uploading", new Object[]{inputName}, locale);  

        if (validation != null) {  

            validation.addFieldError(inputName, errMsg);  

        }  

  

        LOG.warn(errMsg);  

    } else if (maximumSize != null && maximumSize < file.length()) {  

        String errMsg = getTextMessage(action, "struts.messages.error.file.too.large", new Object[]{inputName, filename, file.getName(), "" + file.length()}, locale);  

        if (validation != null) {  

            validation.addFieldError(inputName, errMsg);  

        }  

  

        LOG.warn(errMsg);  

    } else if ((!allowedTypesSet.isEmpty()) && (!containsItem(allowedTypesSet, contentType))) {  

        String errMsg = getTextMessage(action, "struts.messages.error.content.type.not.allowed", new Object[]{inputName, filename, file.getName(), contentType}, locale);  

        if (validation != null) {  

            validation.addFieldError(inputName, errMsg);  

        }  

  

        LOG.warn(errMsg);  

    } else if ((!allowedExtensionsSet.isEmpty()) && (!hasAllowedExtension(allowedExtensionsSet, filename))) {  

        String errMsg = getTextMessage(action, "struts.messages.error.file.extension.not.allowed", new Object[]{inputName, filename, file.getName(), contentType}, locale);  

        if (validation != null) {  

            validation.addFieldError(inputName, errMsg);  

        }  

  

        LOG.warn(errMsg);  

    } else {  

        fileIsAcceptable = true;  

    }  

  

    return fileIsAcceptable;  

}  

别的先不管,先看看到第2,3个else if节点,分别是利用了allowedTypesSet和allowedExtensionsSet,如下

[java] view
plain copy

} else if (allowedTypesSet不为空 && allowedTypesSet不包含该文件的类型) {  

  

// 添加错误信息....  

  

} else if (allowedExtensionsSet不为空 && allowedExtensionsSet不包含该文件的后缀名) {  

  

// 添加错误信息  

  

}  

从上面的代码中可以看出,如果我们要利用allowedExtensions参数来控制上传文件的后缀名,则不能配置allowedTypes参数。

否则,如果allowedTypes参数有配置,那么allowedExtensions参数将不会再起效。

总结

使用Struts文件上次功能,我们可以使用”文件类型“和”文件后缀名“两者中的一个来控制上传文件的类型/后缀名。但是,allowedTypes的优先级别高于allowedExtensions,如果配置了allowedTypes则allowedExtensions将不再起效。最后附上allowedExtensions的一个简单配置:

[html] view
plain copy

<!-- 允许后缀名为png,bmp,jpg,doc,xls的文件上传 -->     

<param name="allowedExtensions">  

    png,bmp,jpg,doc,xls  

</param>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0