原作者:尚硅谷-佟刚
多文件的上传
struts.xml
<!-- 配置国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="i18n"/>
<!-- 配置上传文件总的大小 -->
<constant name="struts.multipart.maxSize" value="1024000"/>
<interceptors>
<interceptor name="hello" class="com.atguigu.struts2.interceptors.MyInterceptor"/>
<interceptor-stack name="atguigustack">
<interceptor-ref name="defaultStack">
<!-- 上传文件单个大小 -->
<param name="fileUpload.maximumSize">10240</param>
<param name="fileUpload.allowedTypes">text/html,text/xml,text/plain</param>
<param name="fileUpload.allowedExtensions">html,dtd,xml,txt</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="atguigustack"/>
<action name="testUpload" class="com.atguigu.struts2.upload.app.UploadAction">
<result>/success.jsp</result>
<result name="input">/upload.jsp</result>
</action>
i18n.properties(struts2-core-2.3.30.jar 包下
org/apache/struts2/struts-messages.properties)
struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=File {0} is too large to be uploaded. Maximum allowed size is {4} bytes!
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed\: {0} "{1}" "{2}" {3}
upload.jsp
<s:form action="testUpload" method="post" enctype="multipart/form-data" theme="simple">
<s:fielderror name="uploads"/>
<s:actionerror/>
uploadsFile:<s:file name="uploads" label="uploadsFile"/>
uploadsDesc:<s:textfield name="uploadsDesc[0]" label="uploadsDesc"/>
<br><br>
uploadsFile:<s:file name="uploads" label="uploadsFile"/>
uploadsDesc:<s:textfield name="uploadsDesc[1]" label="uploadsDesc"/>
<br><br>
uploadsFile:<s:file name="uploads" label="uploadsFile"/>
uploadsDesc:<s:textfield name="uploadsDesc[2]" label="uploadsDesc"/>
<br><br>
<s:submit/>
</s:form>
success.jsp
<body>
<h4>Success Page</h4>
</body>
uploadAction.java
package com.atguigu.struts2.upload.app;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private List<File> uploads;
private List<String> uploadsContentType;
private List<String> uploadsFileName;
private List<String> uploadsDesc;
@Override
public String execute() throws Exception {
System.out.println(uploads);
System.out.println(uploadsContentType);
System.out.println(uploadsFileName);
System.out.println(uploadsDesc);
ServletContext servletContext = ServletActionContext.getServletContext();
String dir = servletContext.getRealPath("\\files");
BufferedOutputStream bos=null;
BufferedInputStream bis=null;
int len=0;
byte[] buffer=new byte[1024];
if(uploads!=null&&uploads.size()>0){
for(File upload:uploads){
bis=new BufferedInputStream(new FileInputStream(upload));
bos=new BufferedOutputStream(new FileOutputStream(dir+"\\"+upload.getName()));
while((len=bis.read(buffer))!=-1){
bos.write(buffer, 0, len);
}
bis.close();
bos.close();
}
}
return SUCCESS;
}
public List<File> getUploads() {
return uploads;
}
public void setUploads(List<File> uploads) {
this.uploads = uploads;
}
public List<String> getUploadsContentType() {
return uploadsContentType;
}
public void setUploadsContentType(List<String> uploadsContentType) {
this.uploadsContentType = uploadsContentType;
}
public List<String> getUploadsFileName() {
return uploadsFileName;
}
public void setUploadsFileName(List<String> uploadsFileName) {
this.uploadsFileName = uploadsFileName;
}
public List<String> getUploadsDesc() {
return uploadsDesc;
}
public void setUploadsDesc(List<String> uploadsDesc) {
this.uploadsDesc = uploadsDesc;
}
}
页面运行效果
文件类型不符
文件超出范围
文件上传成功
文件下载
struts.xml
<action name="testDownload" class="com.atguigu.struts2.download.app.DownLoadAction">
<result type="stream">
<param name="bufferSize">2048</param>
</result>
</action>
DownLoadAction.java
package com.atguigu.struts2.download.app;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownLoadAction extends ActionSupport{
private String contentType;
private long contentLength;
private String contentDisposition;
private InputStream inputStream;
public String getContentType() {
return contentType;
}
public long getContentLength() {
return contentLength;
}
public String getContentDisposition() {
return contentDisposition;
}
public InputStream getInputStream() {
return inputStream;
}
@Override
public String execute() throws Exception {
//确定各个成员变量的值
contentType="text/html";
contentDisposition="attachment;filename=hidden.html";
ServletContext servletContext=
ServletActionContext.getServletContext();
String fileName=servletContext.getRealPath("/files/hidden.html");
inputStream=new FileInputStream(fileName);
contentLength=inputStream.available();
return SUCCESS;
}
}
download.jsp
<body>
<a href="testDownload">Down load</a>
</body>
服务器上的文件
页面运行效果
download.jsp
防止表单的重复提交(token&tokenSession拦截器)
i18n.properties(struts2-core-2.3.30.jar 包下
org/apache/struts2/struts-messages.properties)
struts.messages.invalid.token=\u8868\u5355\u91CD\u590D\u63D0\u4EA4\u4E86\!
struts.xml
<action name="testToken" class="com.atguigu.struts2.token.app.TokenAction">
<interceptor-ref name="token"/>
<interceptor-ref name="defaultStack"/>
<result>/success.jsp</result>
<result name="invalid.token">/token-error.jsp</result>
</action>
TokenAction.java
package com.atguigu.struts2.token.app;
import com.opensymphony.xwork2.ActionSupport;
public class TokenAction extends ActionSupport {
private String username;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
@Override
public String execute() throws Exception {
//模拟网络延时
Thread.sleep(3000);
System.out.println(username);
return super.execute();
}
}
token.jsp
<s:form action="testToken">
<s:token/>
<s:textfield name="username" label="Username"/>
<s:submit/>
</s:form>
token-error.jsp
<s:debug/>
<h4>Token Error Page</h4>
<s:actionerror/>
success.jsp
<body>
<h4>Success Page</h4>
</body>
页面运行效果
tokenSession拦截器
与token拦截器最大的不同,当表单重复提交时会跳过请求的Action
而直接响应成功页面
struts.xml
<action name="testToken" class="com.atguigu.struts2.token.app.TokenAction">
<interceptor-ref name="tokenSession"/>
<interceptor-ref name="defaultStack"/>
<result>/success.jsp</result>
<result name="invalid.token">/token-error.jsp</result>
</action>
页面运行效果