Struts无论是基于注解还是配置文件都可以实现,这里使用注解方式开发,struts有封装好的文件上传对象,需要引入两个jar包
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
文件上传struts限制大小是2MB,如果超过2MB就会抛出异常,解决的方法是在struts.xml配置文件添加上
<struts>
<constant name="struts.multipart.maxSize
" value="52428800"></constant>
</struts>
限制大小是50MB,value的单位是byte
单文件上传
html界面:
form 表单的属性如果要上传文件一定要加上enctype="multipart/form-data"
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload/singleUpload" method="post" enctype="multipart/form-data">
<label>选择文件:</label>
<input type="file" name="ff"><br>
<input type="submit" value="上传"/>
</form>
</body>
</html>
Action:
这两个属性很重要
private File ff;//要与前台的name一致
private String ffFileName;//name+FileName是文件的名字
package sdibt.fly.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
@Namespace("/upload")
@ParentPackage("struts-default")
public class UploadAction {
private File ff;//要与前台的name一致
private String ffFileName;//name+FileName是文件的名字
public File getFf() {
return ff;
}
public void setFf(File ff) {
this.ff = ff;
}
public String getFfFileName() {
return ffFileName;
}
public void setFfFileName(String ffFileName) {
this.ffFileName = ffFileName;
}
@Action(value="singleUpload",results={@Result(name="success",location="/upload_success.html")})
public String singleUpload() throws IOException{
//拿到文件,将文件存储在C盘,使用IO流输出到D盘
//拿到输入流
FileInputStream in = new FileInputStream(ff);
//输出流 输出到D盘
FileOutputStream out = new FileOutputStream(new File("d:\\"+ffFileName));
byte[] b = new byte[1024];
int len=0;
//不断写入文件
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
out.close();
in.close();
return "success";
}
}
Struts提供了一个io包,里面的FileUtils类可以直接完成对文件的赋值
@Action(value="singleUpload",results={@Result(name="success",location="/upload_success.html")})
public String singleUpload() throws IOException{
//拿到文件,将文件存储在C盘,使用FileUtils输出到D盘
//第一个参数是要拷贝的文件,第二个是目标文件
FileUtils.copyFile(ff, new File("d:\\"+ffFileName));
return "success";
}
多文件上传:
前台界面只不过再添加几个input框,name的属性要一致
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload/singleUpload" method="post" enctype="multipart/form-data">
<label>选择文件:</label>
<input type="file" name="ff" ><br>
<input type="file" name="ff" ><br>
<input type="file" name="ff" ><br>
<input type="submit" value="上传"/>
</form>
</body>
</html>
Action收到的参数就会是一个File数组和一个fileName数组
package sdibt.fly.action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
@Namespace("/upload")
@ParentPackage("struts-default")
public class UploadAction {
private File[] ff;//要与前台的name一致
private String[] ffFileName;//name+FileName是文件的名字
public File[] getFf() {
return ff;
}
public void setFf(File[] ff) {
this.ff = ff;
}
public String[] getFfFileName() {
return ffFileName;
}
public void setFfFileName(String[] ffFileName) {
this.ffFileName = ffFileName;
}
@Action(value="multiUpload",results={@Result(name="success",location="/upload_success.html")})
public String multiUpload() throws IOException{
//拿到文件,将文件存储在C盘,使用FileUtils输出到D盘
//循环调用copyFile方法
for (int i=0; i<ff.length; i++) {
FileUtils.copyFile(ff[i], new File("d:\\"+ffFileName[i]));
}
return "success";
}
}