问题:
最近在做Struts2上传图片时,遇到文件类型校验问题。系统中只允许上传指定格式的问题,如:jpg,jpeg,png等,我按照以往的经验对Struts2的action配制文件进行了配制,在功能完成后对后其进行测试,在FF下工作正常,但在IE下却报找不到action中的validate(验证)方法。。
解决:
其实并不是找不到验证方法,问题是IE在图片上传过程中,把jpeg格式的文件翻译成了pjpeg,而我在struts的action配制文件中只配置了image/jpeg,并没有配置image/pjpeg,所以通不过struts2的默认validate(验证),所以就会报错。
详细信息:
在Struts2的Action配置文件中,加了Struts2默认fileUploadStack栏截器,并加了类型拦截参数,如下:
<action name="upLoadPhoto" class="picAction" method="upLoadPhoto">
<interceptor-ref name="fileUpload">
<param name ="allowedTypes">
image/png,image/gif,image/jpeg
</param >
<param name="maximumSize">
2097152
</param>
</interceptor-ref>
<interceptor-ref name ="fileUploadStack"/>
<interceptor-ref name = "defaultStack"/>
<result name="success" type="redirect">updatePhoto</result>
<result name="error" type="redirect">/user/toLogin.action</result>
</action>
以上配置在FF下没有任何问题,符合类型的图片都可能正确上传,但是在IE下会他如下错误:
2011-01-11 11:10:02 DEBUG -falling back to default type converter
[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@17d93a9]
2011-01-11 11:10:02 DEBUG -Validating /albums/upLoadPhoto with
method upLoadPhoto.
2011-01-11 11:10:02 DEBUG -Invoking validate() on action com.pyj.
web.ui.albums.PicAction@91e0a8
2011-01-11 11:10:02 DEBUG -cannot find method [validateUpLoadPhoto]
in action [com.pyj.web.ui.albums.PicAction@91e0a8]
2011-01-11 11:10:02 DEBUG -cannot find method [validateDoUpLoadPhoto]
in action [com.pyj.web.ui.albums.PicAction@91e0a8]
2011-01-11 11:10:02 DEBUG -Errors on action com.pyj.web.ui.albums.PicAction@91e0a8,
returning result name 'input'
2011-01-11 11:10:02 WARN -Could not find action or result
No result defined for action com.pyj.web.ui.albums.PicAction and result input
从报错信息看是因为我在Action中没有配置validateUpLoadPhoto方法,没有通过Struts2的验证,所以Struts2自动返回input结果,但当我在Action中添加了validateUpLoadPhoto,方法体如下:
public void validateUpLoadPhoto(){
//空方法
}
错误依然存在,接着我又在validateUpLoadPhoto方法中打出Struts2的所有错误信息:
public void validateUpLoadPhoto(){
for (String one : getActionErrors()) {
System.out.println(one);
}
for (String one : getActionMessages()) {
System.out.println(one);
}
Map<String, List<String>> fieldErrors = this.getFieldErrors();
for (Entry<String, List<String>> one : fieldErrors.entrySet()) {
System.out.println(one.getKey()+":"+one.getValue());
}
}
actionerror,actionmessage都为空,而fielderror却有错误信息,
phf:[Content-Type not allowed: phf "5.jpg" "upload__538d61dd_12d732b033c__8000_00000002.tmp" image/pjpeg]
可以看到,IE把jpeg类型的文件翻译成了pjpeg,到此问题基本已经找出,现在修改Action配制文件即可,如下:
<action name="upLoadPhoto" class="picAction" method="upLoadPhoto">
<interceptor-ref name="fileUpload">
<param name ="allowedTypes">
image/png,image/gif,image/jpeg,image/pjpeg
</param >
<param name="maximumSize">
2097152
</param>
</interceptor-ref>
<interceptor-ref name ="fileUploadStack"/>
<interceptor-ref name = "defaultStack"/>
<result name="success" type="redirect">updatePhoto</result>
<result name="error" type="redirect">/user/toLogin.action</result>
</action>
到此问题解决,并不是没有validate()方法的原因,而是IE在文件上传时,翻译图片格式的问题。validateUpLoadPhoto方法默认可以不写,struts2的默认validate可以对图片进行验证。
附IE下文件上传,图片类型转换规则:
转自:http://blog.csdn.net/jationxiaozi/archive/2010/12/24/6096706.aspx
firefox |
image/jpeg |
image/bmp |
image/gif |
image/png |
ie 6 |
image/pjpeg |
image/bmp |
image/gif |
image/x-png |
ie 7 |
image/pjpeg |
image/bmp |
image/gif |
image/x-png |
ie 8 |
image/pjpeg |
image/bmp |
image/gif |
image/x-png |
分享到:
相关推荐
此外,对于更复杂的校验规则,Struts2允许开发者通过覆盖Action类中的`validate()`方法或创建特定的`validateXxx()`方法来实现自定义校验。 在Struts2中,输入校验的流程如下: 1. 类型转换器:Struts2将接收到的...
在Struts2中,类型转换和数据校验是两个关键的特性,它们确保了用户输入的数据能够准确无误地被处理和验证,从而提高了应用的安全性和可靠性。 **类型转换(Type Conversion)** 在Struts2中,类型转换是自动进行...
- **XML配置文件**:Struts2支持基于XML的校验配置文件,分为局部校验配置文件和全局校验配置文件。局部校验文件针对单个Action类,而全局校验文件适用于整个应用。配置文件内容包括字段校验(field validation)和...
5. **内置校验器**:Struts2提供了丰富的内置校验器,覆盖了从简单的类型检查到复杂的数据验证。例如`required`用于检查字段是否为空,`int`和`double`用于数值类型检查,`email`用于电子邮件地址验证等。 综上所述...
struts2的输入校验有两种方式: 一.重写validate()方式 二.采用配置文件的方式 先我们就以一个简单的登录的例子来讲解这个吧. 重点讲解下,第二个采用配置文件的方式: 1.添加一个xml的校验文件,保存在...
总结,Struts2提供了方便的文件上传功能,但需要注意过滤文件类型和大小以确保系统安全和性能。通过配置、校验和处理逻辑,我们可以实现一个完整的文件上传功能,同时确保上传的文件既符合格式要求,又不超过设定的...
为了处理更复杂的数据校验场景,Struts 2支持使用Validator插件,它可以读取XML配置文件或者使用JSR 303/JSR 349(Bean Validation)标准来进行校验。通过Validator插件,可以定义全局的校验规则,复用性强,同时也...
在Eclipse中配置Struts2...Struts2―表单验证validate(html)对validate的type属性校验类型以及param 做了详细的解释说明。 struts2和struts的比较 让你更清楚的知道struts2和struts的不同之处。 struts教程(html)
Struts2集成了Apache Commons Validator,可以通过配置XML文件定义校验规则。在struts.xml文件中配置`<validators>`元素,然后在Action类中创建一个ValidatorForm对象,将表单字段映射到该对象的属性,即可应用预...
总结,Struts2的输入校验机制提供了手动和自动两种方式,结合配置文件和内置校验器,能够实现灵活且强大的数据校验,有效地防止了非法数据的流入,提升了系统的安全性。在实际开发中,开发者可以根据业务需求选择...
本篇文章将详细介绍如何在Struts2中进行输入校验,包括两种主要实现方式:使用Action中的`validate()`方法和使用XML文件。 1. 使用Action中的`validate()`方法: 在Struts2中,每个Action类都可以包含一个名为`...
在Web开发中,jQuery Validate和Struts2是两个非常重要的工具。jQuery Validate是一个轻量级的JavaScript库,用于对HTML表单进行验证,确保用户输入的数据符合预设的规则。而Struts2是一个基于MVC设计模式的Java Web...
客户端校验是通过在JSP页面中的`<s:form validate="true">`标签实现的,这会触发Struts2的JavaScript校验,使得用户在提交前就能得到反馈,提高了用户体验。 总结来说,Struts2的表单校验机制提供了多种灵活的方式...
首先,Struts2的校验框架是基于Action类的,每个Action类都可以关联一个或多个校验规则文件,通常是XML格式的,定义了字段级别的验证规则。例如,对于一个注册表单,你可能需要验证用户名的长度、密码的复杂性等。在...
3. 配置文件校验:除了代码实现外,Struts2还支持基于XML的配置文件进行校验。在struts.xml或相应的action配置中,可以定义field和global validation规则,这种方式更加灵活且易于维护。 接下来,我们谈谈Struts2的...
在Struts框架中,`validate`是用于表单验证的重要组成部分,帮助开发者实现业务逻辑中的数据校验。 在`struts validate`中,验证过程通常分为两个阶段:客户端验证和服务器端验证。客户端验证通常使用JavaScript...
为了将前后端验证结果进行有效传递,我们需要在Struts2的配置文件struts.xml中定义result类型,如“input”结果类型,用于处理验证失败的情况。同时,通过使用struts标签库,如,在JSP页面上显示验证错误信息。 ...
在Struts2中,我们需要在`struts.xml`配置文件中声明我们的自定义校验器。这可以通过添加`<validators>`标签和对应的`<validator>`标签来完成。例如: ```xml 自定义错误消息 ``` 3. **校验规则...