第一步:引入jar包,后者jar包是很重要的,利用它的FileUtils处理上传的文件
第二步:把form表单中的 enctype 设置为:multipart/form-data
表单中包含一个<input type=”file” >
<!-- 单文件上传 -->
<s:form action="fileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<br>
<input type="submit" value="提交"/>
</s:form>
第三步:在Action类中添加一些属性
注意:后台的File对象的名称要和前台的input的name相同,这样struts2就可以利用反射技术调用set方法给File赋值了
package com.dx.action;
import java.io.*;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport{
private static final long serialVersionUID = -2506541803894251705L;
private String username;
//注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件
private File file;
//提交过来的file的名字
private String fileFileName;
//提交过来的file的MIME类型
private String fileContentType;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(root, fileFileName));
System.out.println("fileFileName: " + fileFileName);
// 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同
System.out.println("file: " + file.getName());
System.out.println("file: " + file.getPath());
byte[] buffer = new byte[500];
int length = 0;
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
return "success";
}
注意上传的文件大小的限制,这个是可以设置的
<constant name= "struts.multipart.maxSize" value="XXXX" />
value就是设置文件的大小,注意它是所有文件大小的总和,默认是 2M.
多文件上传
它的步骤和单个文件上传其实差不多,只不过file变成了文件的数组而已,保存时循环一下就好了
注意,jsp中定义的type为file的input的name要相同
<!-- 多文件上传 -->
<s:form action="fileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<br>
<input type="file" name="file" />
<br>
<input type="file" name="file" />
<br>
<input type="file" name="file" />
<br>
<input type="submit" value="提交"/>
</s:form>
Action.java
package com.dx.action;
import java.io.*;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport{
private static final long serialVersionUID = -2506541803894251705L;
private File[] file;
private String[] fileFileName;
private String[] fileContentType;
// 得到上下文路径
public String execute()throws Exception{
String realpath = ServletActionContext.getServletContext().getRealPath("/upload");
// 新建一个File,如果不存在这个目录就创建出这个目录
File newFile = new File(realpath);
if (!newFile.exists()){
newFile.mkdirs();
}
for(int i=0,len=file.length;i<len;i++){
FileUtils.copyFile(file[i], new File(newFile, fileFileName[i]));// 然后复制文件
}
return "success";
}
File[] getFile() {
return file;
}
public void setFile(File[] file) {
this.file = file;
}
public String[] getFileFileName() {
return fileFileName;
}
public void setFileFileName(String[] fileFileName) {
this.fileFileName = fileFileName;
}
public String[] getFileContentType() {
return fileContentType;
}
public void setFileContentType(String[] fileContentType) {
this.fileContentType = fileContentType;
}
}