struts2的文件上传是用拦截器实现的,我们可以不用去关心底层的实现,使得上传文件变得很简单。
upload.jsp如下:
<s:form action="uploadFile" method="post" theme="xhtml" enctype="multipart/form-data">
<s:file label="File" name="some" />
<s:submit value="上传" />
</s:form>
也可以采用html标签:
<s:form action="upload" method="post" theme="xhtml"
enctype="multipart/form-data">
<s:file label="File" name="some" />
<s:submit value="提交" />
</s:form>
上传页面要注意 method="post" enctype="multipart/form-data"
Action代码如下:
public class UploadAction {
private File some;
private String someFileName;
private String someContentType;
public String uploadFile() throws Exception {
if(file != null) {
//获取存放文件的目录
String saveDir = ServletActionContext.getServletContext().getRealPath("D:/test/upload");
File dirFile = new File(saveDir);
}
//如果目录不存在,就创建目录
if(!dirFile.exists()) {
dirFile.mkdir();
}
//获取目标文件名
String targetFileName = generateFileName(fileFileName);
//生成目标文件
File targetFile = new File(saveDir,targetFileName);
//复制文件到存放路径,FileUtils是apache旗下commons-io包中的一个工具类
FileUtils.copyFile(file,targetFile);
//实际中可能需要将一些文件信息保存到数据中,比如原始文件名称、文件大小、文件存放路径等信息
//可调用相关的业务逻辑进行处理}
return SUCCESS;
}
//生成新文件名
private String generateFileName(String fileName) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String formatDate = sdf.format(new Date());
int random = new Random().nextInt(1000);
int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);
return formatDate + random + extension;
}
public String getSomeContentType() {
return someContentType;
}
public void setSomeContentType(String someContentType) {
this.someContentType = someContentType;
}
public String getSomeFileName() {
return someFileName;
}
public void setSomeFileName(String someFileName) {
this.someFileName = someFileName;
}
public File getSome() {
return some;
}
public void setSome(File some) {
this.some = some;
}
}
配置文件如下:
<!-- 设置文件上传大小限制 -->
<constant name="struts.multipart.maxSize" value="10000000"/>
<!--文件临时存放目录 -->
<constant name="struts.multipart.saveDir" value="D:/temp"/>
<package name="default" namespace="/" extends="struts-default">
<!-- 默认的全局拦截器 -->
<default-interceptor-ref name="defaultStack"/>
<!-- 文件上传 -->
<action name="uploadFile" class="com.test.FileUploadAction" method="uploadFile">
<!-- 如果配置了全局拦截器栈 defaultStack,是不需要再配置拦截器fileUpload 因为defaultStack中已包含fileUpload拦截器-->
<!---进行上传文件大小限制->
<!--<interceptor-ref name="fileUpload">
<param name="maximumSize">1024000</param>
</interceptor-ref>-->
<!--<interceptor-ref name="fileUpload"/>-->
<result>
/WEB-INF/page/common/success.jsp
</result>
</action>
</package>
不建议在struts.properties文件直接修改struts的配置。
建议在struts.xml中以类似 <constant name="struts.multipart.maxSize" value="10000000"/>的形式进行配置修改。