struts2文件上传
先在项目的WebContent下新建一个upload文件夹
单个文件上传
<!-- struts2的前端控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
说明 |
---|
需要在表单中添加enctype="multipart/form-data" 属性 |
<body>
<form action="upload.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
</body>
说明 |
---|
①File 类型的属性名称命名规则:必须等于表单域名。 |
②上传文件名命名规则:表单域名+FileName (不可变)。 |
③上传文件类型命名规则:表单域名+ContentType |
以上三个属性必须有get和set方法!!! |
//默认上传文件大小不能大于2M
public class UploadAction {
//该属性名要与表单名称一致
private File file;
//上传文件名,也是由struts2设置好
//属性名=表单域名+FileName(不能改变)
private String fileFileName;
//文件类型,也是由struts2设置好
//属性名=表单域名+ContentType
private String fileContentType;
//上传文件的业务方法
public String upload() {
//获取上传文件目录
String path = ServletActionContext.getServletContext().getRealPath("/upload");
//
try {
FileUtils.copyFile(file, new File(path, fileFileName));
return Action.SUCCESS;
} catch (IOException e) {
e.printStackTrace();
}
return Action.ERROR;
}
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;
}
}
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="upload" class="com.x.action.UploadAction" method="upload">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
说明 |
---|
按照上面配置,文件上传的大小默认不能大于2M。如果文件上传的大小大于2M,则需要进行配置。配置方法如下: |
①引入上传文件的拦截器:<interceptor-ref name="fileUpload"></interceptor-ref> |
②设置其参数,对单个文件上传的大小进行修改:<param name="maximumSize">67388135</param> |
③当自己引入拦截器后,默认拦截器不能自动生效,需要手动引用 :<interceptor-ref name="basicStack"></interceptor-ref> |
④其次,可以设置上传文件总大小(必须大于等于单个文件大小): <constant name="struts.multipart.maxSize" value="67388135"> |
⑤还可以设置上传文件的临时目录,上传成功后会被删除合并:<constant name="struts.multipart.saveDir" value="E:\"> |
配置代码如下: |
<struts>
<!-- 设置上传文件的临时目录,上传成功后会被删除合并 -->
<constant name="struts.multipart.saveDir" value="E:\"></constant>
<!-- 设置上传文件总大小 -->
<constant name="struts.multipart.maxSize" value="67388135"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="upload" class="com.x.action.UploadAction" method="upload">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 设置上传单个文件的大小 -->
<param name="maximumSize">67388135</param>
</interceptor-ref>
<!-- 注意,当自己引入拦截器后,默认拦截器不能自动生效,需要手动引用 -->
<interceptor-ref name="basicStack"></interceptor-ref>
</action>
</package>
</struts>
批量上传文件
<body>
<form action="batchUpload.action" method="post" enctype="multipart/form-data">
文件1:<input type="file" name="file"><br>
文件2:<input type="file" name="file"><br>
文件2:<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
</body>
说明 |
---|
只是把对应单个文件上传三个属性设置为数组形式,在保存文件时永for循环即可。 |
public class BatchUploadAction {
//该属性名要与表单名称一致
private File file[];
//上传文件名,也是由struts2设置好
//属性名=表单域名+FileName(不能改变)
private String fileFileName[];
//文件类型,也是由struts2设置好
//属性名=表单域名+ContentType
private String fileContentType[];
//上传文件的业务方法
public String upload() {
//获取上传文件目录
String path = ServletActionContext.getServletContext().getRealPath("/upload");
try {
for(int i = 0; i < file.length; i++) {
FileUtils.copyFile(file[i], new File(path, fileFileName[i]));
}
return Action.SUCCESS;
} catch (IOException e) {
e.printStackTrace();
}
return Action.ERROR;
}
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;
}
}
<struts>
<!-- 设置上传文件的临时目录,上传成功后会被删除合并 -->
<constant name="struts.multipart.saveDir" value="E:\"></constant>
<!-- 设置上传文件总大小 -->
<constant name="struts.multipart.maxSize" value="67388135"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="batchUpload" class="com.x.action.BatchUploadAction" method="upload">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 设置上传单个文件的大小 -->
<param name="maximumSize">67388135</param>
</interceptor-ref>
<!-- 注意,当自己引入拦截器后,默认拦截器不能自动生效,需要手动引用 -->
<interceptor-ref name="basicStack"></interceptor-ref>
</action>
</package>
</struts>
<!-- struts2的前端控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
struts2文件下载
先在WebContent目录下新建download文件夹,放入将要下载的文件
文件下载
首先注意,对于文件下载,可以使用<a></a>
标签,直接给出文件路径进行下载。但是,对于浏览器来说,默认使用inline
方式下载文件,即如果可以解析,则将内容显示出来,如txt类型文件,而且任何用户得到链接都可以下载,没法进行权限的控制,导致不安全;如果不能解析,才进行下载。因此,需要使用流的方式进行文件下载。
<!-- 显示 -->
<a href="download/a.txt">下载文件</a>
<!-- 下载 -->
<a href="download/a.rar">下载文件</a>
struts2文件下载步骤
<!-- struts2的前端控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<body>
<a href="download.action?fileName=a.txt">下载文件</a>
</body>
public class DownloadAction {
//下载文件名
private String fileName;
public String download() {
//可以进行权限设置
return Action.SUCCESS;
}
//要注意这个方法名,可以关联源码看一下,InputName默认为inputstream
public InputStream getInputStream() throws FileNotFoundException {
String path = ServletActionContext.getServletContext().getRealPath("/download");
return new FileInputStream(new File(path, fileName));
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
说明 |
---|
①<result type="stream"> 代表返回值为流类行,关系到处理类中的public InputStream getInputStream() 方法。 |
对于①可以关联<result-type name="stream" class="org.apache.struts2.result.StreamResult"/> 该类的源码进行查看。 |
②需要配置文件下载时的名称及下载方式:<param name="contentDisposition">attachment;filename=${fileName}</param> 。此外还可以设置文件下载类型等 |
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="download" class="com.x.action.DownloadAction" method="download">
<!-- 文件下载结果集 -->
<result type="stream">
<!-- 默认为inline,需要修改为attachment -->
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>
</package>
</struts>
重点:关于文件下载类型的响应头,如果使用tomcat,可以在web.xml中查看!!!