由于struts2的上传机制是通过默认拦截器实现,而默认拦截器的默认大小是大约2M。所以如果设置不当,用户上传2M以上的文件就会被拦截器拦截并在后台抛出异常。异常如下:
严重: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException:
the request was rejected because its size (6964497) exceeds the configured maximum (2097152)
想到在action中设置拦截器拦截文件大小=3M,如下:
<interceptor-ref name ="fileUpload">
<param name ="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg</param>
<param name="maximumSize
">3000000</param>
</interceptor-ref>
当发现,上传2M的文件时还是不行,照样被默认拦截器截下,并抛出上面的异常。看样子是出在默认拦截器的文件大小的设置上,接着自己把fileupload拦截器去除,自己在action中实现上传错误的业务逻辑。并把默认拦截器的默认最大值设为10M
发现程序终于可以运行到action中去了。
struts.properties
struts.multipart.maxSize=10000000
ACTION
package com;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.*;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport {
private static final long serialVersionUID = 572146812454l;
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
private String[] imageFileName;
private String msg="";
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String[] getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public File[] getUpload() {
return upload;
}
public void setUpload(File[] upload) {
this.upload = upload;
}
public String[] getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setImageFileName(String[] imageFileName) {
this.imageFileName = imageFileName;
}
public String[] getImageFileName() {
return imageFileName;
}
private static void copy(File src, File dst) {
try {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dst);
int len=0;
byte[] buffer=new byte[1024];
while ((len=in.read(buffer)) > 0) {
out.write(buffer,0,len);
}
}
finally {
if (null != in) {
in.close();
}
if (null != out) {
out.close();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private boolean filetype(String current){
String[] type={"image/bmp","image/png","image/gif","image/jpeg","image/jpg"};
for(String now:type){
if(now.equals(current)){
return true;
}
}
return false;
}
private String judge(){
try{
int flag=0;
for(int i=0;i<upload.length;i++){
if(filetype(uploadContentType[i])==false){
msg+="<li>"+uploadFileName[i]+" 上传文件的类型错误,只能上传图片类型的文件!</li>"+"\n";
flag=1;
}
InputStream in=new FileInputStream(upload[i]);
int size=in.available();
if(size>1024*1024){
msg+="<li>"+uploadFileName[i]+"上传文件的大小错误, 单个文件大小小于1M!</li>"+"\n";
flag=1;
}
in.close();
}
if(flag==1){
return INPUT;
}else{
return SUCCESS;
}
}catch (Exception e) {
e.printStackTrace();
}
return ERROR;
}
@Override
public String execute() {
String result=judge();
String[] target=new String[upload.length];
if(result==SUCCESS){
for(int i=0;i<upload.length;i++){
target[i] = System.currentTimeMillis() + uploadFileName[i].substring(uploadFileName[i].lastIndexOf("."));
File imageFile = new File(ServletActionContext.getServletContext()
.getRealPath("/uploadImages")
+ "/" + target[i]);
copy(upload[i], imageFile);
}
setImageFileName(target);
}
return result;
}
}
分享到:
相关推荐
本篇将详细介绍Struts2中如何进行文件大小设置,以及涉及到的拦截器配置和灵活性。 首先,我们需要理解Struts2的文件上传机制。在Struts2中,文件上传是通过`<s:file>`标签实现的,这个标签会创建一个`File`对象,...
- Struts 2提供了一个名为`Struts2-FileUpload-plugin`的插件,它可以方便地处理文件上传,并且支持自定义文件大小限制。 5. **安全考虑**: - 不限制文件大小可能会导致DoS攻击,因此,即使服务器和容器未设定...
可以通过验证文件扩展名、限制文件大小和类型,以及将上传的文件保存到指定的安全目录来提高安全性。 6. **优化与拓展** 对于大量文件上传,可以考虑使用多线程处理,提高上传效率。还可以添加进度条显示、断点续...
在这个“struts2上传文件源代码”中,我们将深入探讨Struts2如何实现文件上传功能,以及涉及到的相关知识点。 首先,文件上传是Web应用中常见的功能,它允许用户从本地计算机选择文件并将其发送到服务器。在Struts2...
2. **设置Struts2配置**:配置文件需要指定允许上传的文件大小、类型等。例如,使用`<constant>`标签设置`struts.multipart.parser`为`jakarta`,以启用`Commons FileUpload`。 3. **编写Action类**:在Action类中...
Struts框架通过解析这个格式化的请求,可以获取到上传文件的信息。 1. **配置Struts2 Action**:在Struts2中,我们需要创建一个Action类来处理文件上传请求。这个类通常需要实现`ServletRequestAware`接口,以便...
这里我们启用了multipart/form-data类型的数据解析,并设置了最大上传文件大小为20MB。 接下来,创建一个Action类来处理文件上传请求。这个类需要继承自`org.apache.struts2.dispatcher.multipart....
在这个例子中,`allowedTypes`参数指定了允许上传的文件类型,`maximumSize`参数设置了文件大小的上限(以字节为单位)。如果你想要取消这些限制,可以在`struts.xml`中找到相关的配置项并进行修改。例如,你可以...
首先,我们需要在`struts.xml`配置文件中启用文件上传功能,并指定允许的最大文件大小: ```xml <constant name="struts.multipart.maxSize" value="10485760"></constant> <!-- 单位为字节,10MB --> ``` 接着,...
同时,我们还需要配置`struts.multipart.saveDir`属性,指定临时文件保存的位置,以及`struts.multipart.maxSize`,限制上传文件的最大大小。 在视图层,通常会有一个HTML表单,使用`enctype="multipart/form-data...
我们需要在Struts2配置文件中引入对应的拦截器`struts.multipart.parser`,例如设置为`jakarta`。 2. **前端表单**:在HTML表单中,使用`enctype="multipart/form-data"`来指定表单类型,以便支持文件上传。`[]" ...
4. **文件大小限制**:可以设置每个文件和总文件大小的限制。 5. **异步上传**:后台处理文件上传,不影响用户继续浏览网页。 **二、Struts2框架介绍** Struts2 是一个基于MVC(Model-View-Controller)模式的Java...
在Struts2的配置文件中,我们可以定义这些规则,例如限制上传文件的大小,只接受特定类型的文件(如图片、文档等)。此外,我们还需要关注安全问题,防止恶意文件上传。 文件上传的实现通常包括以下几个步骤: 1. ...
总的来说,解决Struts2上传文件后文件大小变大的问题,主要在于正确处理输入流和输出流,以及确保使用正确的文件上传配置和API。在处理文件操作时,推荐使用成熟的库如Apache Commons IO,它们通常提供了更稳定和...
在Struts2框架中,处理文件上传是一项常见且重要的功能,尤其当涉及到大文件上传时,往往会遇到上传文件大小超过预设限制的问题。这不仅影响用户体验,还可能导致应用程序出现异常或错误。本文将深入探讨如何解决...
如果上传文件大小超过这个限制,Struts会抛出`MaxUploadSizeExceededException`异常。 2. Spring框架中的文件上传: Spring提供了`CommonsMultipartFile`类来处理文件上传,它是基于Apache Commons FileUpload库的...
然而,实际应用中可能需要考虑更多细节,如文件大小限制、类型检查、安全问题(防止文件覆盖、恶意文件上传等)。对于更复杂的需求,可以利用Struts2的拦截器和插件来扩展功能,或者考虑使用其他专门处理文件上传的...
这个"Struts2+上传文件源码"是一个演示如何在Struts2框架下实现文件上传的示例代码。 首先,我们来理解上传文件的基本流程。在Struts2中,文件上传是通过`Commons FileUpload`库来处理的,这是一个Apache提供的开源...
`FileItem` 是Apache Commons FileUpload提供的类,它可以更精细地控制文件上传的细节,如文件大小限制、文件类型检查等。而`File` 对象则对应于服务器上的临时文件路径,通常在Action执行完毕后,你需要将文件移动...
- 文件大小限制:Struts2默认有文件大小限制,可以通过配置参数`struts.multipart.maxSize`进行调整。 - 文件类型检查:为了安全,需要验证上传文件的类型,防止恶意文件上传。 - 错误处理:确保捕获并处理可能出现...