今天在做Struts文件上传的过程中遇到了一些问题,下面就详细的记录一下
先说一下我想达到的目的,就是在程序中可以控制用户上传文件的大小,如果用户文件的大小超过了配置的大小就给用户返回错误提示信息。最开始的时候我想到的方法是通过FormFile.getFileSize()方法来判断文件的大小是否超标,如果超标,就想用户返回错误信息。但是这种方法的最大问题就是用户的文件已经上传到服务器并且保存在内存中了,万一用户上传了一个1000M的文件怎么办,服务器还不直接挂了。
后来参照struts的文档,配置了文件的大小(<controller maxfilesize="1K"></controller>),这样在上传的过程中,如果文件超过了配置的大小,就会终止文件的上传。相应的FormFile字段为null,我们无法简单的通过判断FormFile是否为空来用户的文件是否超过了配置的大小,不过struts为我们提供了一个途径,在文件超过配置大小时struts会在Servelet Request设置一个属性, MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED,它的值是一个Boolean类型的变量,所以我们可以在Action的execute方法中通过如下代码判断文件是否”超标“:
Boolean maxLengthExceeded = (Boolean) request.getAttribute(
MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED);
if ((maxLengthExceeded != null) && (maxLengthExceeded.booleanValue()))
{
Blar, Blar...
}
到此好像事情已经解决了,但是我遇到了另外一个问题:
我所有Action都是继承自DispatchAction,parameter配置的名称是action。如果我上传的文件没有超过大小,一切OK,程序运行正常,struts根据我设定的action值调用了相应的方法。但是如果我上传了一个比较大的文件,struts就报错说action的值没有设置。不会吧,老大,我明明设置了值,怎么说没有设置呢?有没有搞错,大哥??
到网上找了找也没有相关的文章,没有办法,只用硬着头皮看代码。原来sturts在处理文件上传过程中如果文件的大小超过了配置的大小,那么它就不会对Form中的属性设值,说白了就是Form中的字段都是初始状态,所以action没有设值也就属于正常了。
为了解决这个问题,我把判断文件是否超标的代码放到了Form的validate方法,如果超标就直接返回input页面。但是问题又出现了,在validate返回ActionErrors对象后,页面应该自动返回到input页面,但是我在调试过程中页面怎么也无法返回到input,返回的总是一个空白页面,不光是这一个action出了问题,所有其他返回mapping.getInputForward()的action都不能正常返回了。怎么办?凉拌?看代码呀!
原来<controller maxfilesize="1K"></controller>(<controller maxFileSize="1K">还有一个参数inputForward,其默认值是true,看着字面的意思是如果文件超过了maxFileSize就跳转到input代表的页面。其实不然,它的意思是根据提交页面的url到action的forwards里边找一个名称是url的forward,然后返回这个forward代表的页面。不知道说清楚了没有,大家可以看下面的一个例子
比如我从/input/input.jsp上传一个超标的大文件到actionA,那么struts在validate错误后就会查找actionA的名称叫做/input/input.jsp的actionforward并返回,所以如果我配置了<forward name="/input/input.jsp" path="/input/input.jsp"/>,那么页面的返回就是正常的。知道了inputForward的意思解决方案就简单了,直接inputForward=false就OK了,如下:
<controller maxFileSize="1K" inputForward="false" />
分享到:
相关推荐
在处理文件上传功能时,Struts框架会涉及到文件大小的限制,以防止恶意用户上传过大的文件导致服务器资源耗尽。本篇文章将详细探讨Struts文件上传大小限制的问题。 首先,我们需要理解文件上传的基本流程。在Struts...
Struts框架通过解析这个格式化的请求,可以获取到上传文件的信息。 1. **配置Struts2 Action**:在Struts2中,我们需要创建一个Action类来处理文件上传请求。这个类通常需要实现`ServletRequestAware`接口,以便...
2. **设置Struts2配置**:配置文件需要指定允许上传的文件大小、类型等。例如,使用`<constant>`标签设置`struts.multipart.parser`为`jakarta`,以启用`Commons FileUpload`。 3. **编写Action类**:在Action类中...
可以通过验证文件扩展名、限制文件大小和类型,以及将上传的文件保存到指定的安全目录来提高安全性。 6. **优化与拓展** 对于大量文件上传,可以考虑使用多线程处理,提高上传效率。还可以添加进度条显示、断点续...
本篇将详细介绍Struts2中如何进行文件大小设置,以及涉及到的拦截器配置和灵活性。 首先,我们需要理解Struts2的文件上传机制。在Struts2中,文件上传是通过`<s:file>`标签实现的,这个标签会创建一个`File`对象,...
本文将详细介绍如何在Struts1中实现单文件上传和多文件上传,并探讨如何解决上传文件大小限制的问题。 #### 二、单文件上传 ##### 1. JSP页面设计 为了实现单文件上传,我们需要在JSP页面中创建一个表单,该表单...
- `FormFile`: 用于封装上传文件的信息,包括文件名、类型、大小等。 ### 4. 配置文件 在Struts配置文件(struts-config.xml)中,你需要添加`multipart-config`元素到`<form-beans>`部分,指定文件上传的临时存储...
在Struts中处理文件上传功能时,有时我们需要对上传的文件大小进行限制,以防止恶意用户上传过大的文件导致服务器资源耗尽或者内存溢出等问题。本文将深入探讨Struts中文件上传大小限制的设置及其常见错误处理。 一...
1. **配置Struts2**: 首先,需要在struts.xml配置文件中启用文件上传插件,并设置最大上传文件大小。 ```xml <constant name="struts.multipart.maxSize" value="10485760"></constant> <!-- 10MB --> ...
默认情况下,这个拦截器可能会限制上传文件的类型为`.txt`,并且大小不超过10MB。这种限制是为了防止恶意用户上传大文件或者非文本文件,从而可能对服务器造成压力或引入安全风险。 配置文件`struts.xml`中关于文件...
如果上传文件大小超过这个限制,Struts会抛出`MaxUploadSizeExceededException`异常。 2. Spring框架中的文件上传: Spring提供了`CommonsMultipartFile`类来处理文件上传,它是基于Apache Commons FileUpload库的...
1. 大小限制:为了避免DoS攻击,需要限制上传文件的大小。可以在Struts配置中设置最大上传大小,或者在服务器层面进行限制。 2. 文件类型检查:对上传的文件类型进行检查,只允许特定类型的文件上传,防止恶意文件...
`FileItem` 是Apache Commons FileUpload提供的类,它可以更精细地控制文件上传的细节,如文件大小限制、文件类型检查等。而`File` 对象则对应于服务器上的临时文件路径,通常在Action执行完毕后,你需要将文件移动...
-- 设置最大上传文件大小 --> <result name="success">/success.jsp <result name="input">/upload.jsp ``` 在这个配置中,我们使用了`fileUpload`拦截器来设定文件大小限制,并根据执行结果("success"或...
需要注意文件大小限制、文件类型检查和异常处理。 6. **返回响应**:Action执行完毕后,返回一个表示上传结果的JSON或XML响应。客户端的AJAX回调函数接收到这个响应,可以更新页面显示,告知用户文件是否成功上传。...
避免路径遍历攻击,确保文件存储在安全目录下,防止恶意文件的执行,以及检查上传文件的大小和类型,防止过大文件导致服务崩溃或恶意文件注入。 在本例中,提供的"updown"可能是一个包含示例代码、配置文件或测试...
-- 设置上传文件的最大大小 --> <package name="default" extends="struts-default"> <result name="success">/success.jsp <result name="input">/upload.jsp ``` 在JSP页面中,创建一个HTML表单,使用`...
2. 创建上传文件的JSP页面。 3. 编写Action类,使用Apache Commons FileUpload处理文件。 4. 验证和保存上传的文件。 5. 显示上传结果。 通过这种方式,你可以构建一个灵活且易于维护的文件上传系统。记住,文件...
7. **结果展示**:文件上传成功后,可以返回一个结果页面,显示上传成功的信息,或者提供上传文件的链接。这可以通过Struts2的`<s:property>`标签或者JSP的EL表达式实现。 8. **安全性**:在实际应用中,必须注意...
在上述代码中,我们限制了最大上传文件大小为5MB,并将文件保存到了服务器的一个特定目录。为了防止路径遍历攻击,应使用相对路径或者绝对路径,并确保路径安全。 最后,前端页面(例如upload.jsp)需要包含一个...