使用Struts2的StreamResult进行文件下载/上传,步骤如下。
第一步:右击项目的WebContent目录。
第二步:选择“new->Folder”命令创建一个目录,目录名为download 。
第三步:单击“Finish"按钮完成目录的创建,该目录用于存放下载的文件
第四步:我们把一个图片文件复制到download文件中,作为测试下载文件使用。
第五步:在WebContent目录中创建一个下载页面,如下图所示。
Download.html文件代码如下。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="download?fileName=aa.jpg">下载一张图片</a><br>
</body>
</html>
第六步:在项目中的action数据包中创建一个Action,Action的名称为DownloadAction.java,该类继承了ActionSupper类。
第七步:单击”Finish“结束Action的创建。如下图所示。
DonwnloadAction.java类的代码如下。
package action;
import java.io.*;
import javax.servlet.http.*;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport {
private String fileName;//获取客户请求下载的fileName要一样,且对它进行封装
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public String execute() throws Exception {
return "success";
}
public InputStream getInputStream() throws IOException {
//获取request对象,以便进行接收用户的请求参数,即请下载的文件
HttpServletRequest request = ServletActionContext.getRequest();
//获取下载图片的真实物理路径
String path = request.getRealPath("/download");
//创建输入流用于读到要下载的文件。
InputStream is = new FileInputStream(new File(path, fileName));
return is;
}
}
第八步:struts.xml代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="action.LoginAction">
</action>
<action name="download" class="action.DownloadAction">
<result type="stream">
<!-- inputName默认就是InputStream,可以省略,也可以自己修改,如改成aaa, 则Action里的方法也要改成public InputStream getAaa() -->
<param name="inputName">InputStream</param>
<param name="contentDisposition">attachment;fileName=${fileName}</param>
</result>
</action>
</package>
</struts>
第九步:运行程序。
第十步:单击页面中的超链接,则弹出下载文件的对话,如下图所示。
文件上传
struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可。
一、上传单个文件步骤如下。
第一步:右击WebContent目录会弹出快捷菜单如下图所示。
第二步:选择“new->Folder”命令创建一个目录,目录名为upload,如下图所示 。
第三步:在WebContent目录中创建一个上传文件的页面uploadfile.html,如下图所示。
uploadfile.html的代码如下。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="js/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="js/themes/icon.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.easyui.min.js"></script>
<script type="text/javascript" src="js/easyui-lang-zh_CN.js"></script>
<script type="text/javascript">
$(function(){
$('#ff').dialog({
title: '上传文件',
width: 300,
height: 120,
closed: false,
cache: false,
modal: true ,
buttons:[{
text:'上传',
handler:function(){
$('#ff').form('submit', {
url:"upload", //后的Action的名称
onSubmit: function(){
},
success:function(data){
alert(data)
}
});
}
},{
text:'关闭',
handler:function(){
$('#ff').dialog("close");
}
}]
});
});
</script>
</head>
<body>
<!-- 必须将method指定为post,同时将enctype属性设置成如下形式,
第一个input中的name属性,值必须与Action中定义的Fil类型的变量名相同 -->
<form id="ff" method="post" enctype="multipart/form-data" style="padding 10px;" >
文件:<input type="file" name="uploadFile"/><br>
</form>
</body>
</html>
第三步:在项目中的action数据包中创建一个Action,Action的名称为UploadAction.java,该类继承了ActionSupper类。如下图所示。
第四步:单击”new->Class“命令,弹出创建类的对话框,并在Name输入框中输入UploadAction,Supperclass输入com.opensymphony.xwork2.ActionSupport,如下图所示。
第五步:单击”Finish“结束Action的创建。如下图所示。
UploadAction.java类的代码如下图所示。
package action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
// 这与表单中的上传文件域的变量名称一样
private File uploadFile;
// 这个由表单中上传文件域的变量名称+ContentType构成
private String uploadFileContentType;
// 这个由表单中上传文件域的变量名称+FileName构成
private String uploadFileFileName;
public File getUploadFile() {
return uploadFile;
}
public void setUploadFile(File uploadFile) {
this.uploadFile = uploadFile;
}
public String getUploadFileContentType() {
return uploadFileContentType;
}
public void setUploadFileContentType(String uploadFileContentType) {
this.uploadFileContentType = uploadFileContentType;
}
public String getUploadFileFileName() {
return uploadFileFileName;
}
public void setUploadFileFileName(String uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
}
public UploadAction() {
try {//用户设置接收信息和输出信息统一使用同一编码uft-8,可避免中文乱码
ServletActionContext.getRequest().setCharacterEncoding("utf-8");
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
} catch (Exception e) {
}
}
public String upLoad() throws IOException {
/* 假设保存的虚拟路径为/upload,通过虚拟路径去获取绝对路径 */
String realPath = ServletActionContext.getRequest().getRealPath("/upload");
/* 构造文件路径 ,这个File是java.io数据包下的File */
File file = new File(realPath);
/* 如果不存在 */
if (!file.exists()) {
file.mkdirs();
}
/* 使用struts2的工具类进行上传,第二个参数是目标文件(我们通过文件加上文件名的方式进行构建) */
try {
// FileUtils类是 org.apache.commons.io数据包中的类
FileUtils.copyFile(uploadFile, new File(file, uploadFileFileName));
ServletActionContext.getResponse().getWriter().println("上传文件成功");
} catch (IOException e) {
ServletActionContext.getResponse().getWriter().println("上传文件失败");
}
return null;
}
}
第六步:struts.xml代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="action.LoginAction">
</action>
<action name="download" class="action.DownloadAction">
<result type="stream">
<!-- inputName默认就是InputStream,可以省略,也可以自己修改,如改成aaa, 则Action里的方法也要改成public
InputStream getAaa() -->
<param name="inputName">InputStream</param>
<param name="contentDisposition">attachment;fileName=${fileName}</param>
</result>
</action>
<action name="upload" class="action.UploadAction" method="upLoad">
</action>
</package>
</struts>
第七步:选择程序。
第八步:选择好上传文件后,单击”上传“按钮,会相应的提示信息,如下图所示。
二、上传多个文件步骤如下
第一步:右击WebContent目录会弹出快捷菜单如下图所示。
第二步:选择“new->Folder”命令创建一个目录,目录名为upload,如下图所示 。
第三步:在WebContent目录中创建一个上传文件的页面uploadfiles.html,如下图所示。
uploadfiles.html的代码如下。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="js/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="js/themes/icon.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.easyui.min.js"></script>
<script type="text/javascript" src="js/easyui-lang-zh_CN.js"></script>
<script type="text/javascript">
$(function(){
$('#ff').dialog({
title: '上传文件',
width: 300,
height: 120,
closed: false,
cache: false,
modal: true ,
buttons:[{
text:'上传',
handler:function(){
$('#ff').form('submit', {
url:"uploads", //处理表单的后台Action.
onSubmit: function(){
},
success:function(data){
alert(data) //显示服务器端发回的信息
}
});
}
},{
text:'附加文件',
handler:function(){
var len=$('#ff').dialog().height+24;//获取对话框的高度,再加一行高度24个象素
$("#ff").dialog({height:len});//重新设置对话框的高度,以便添加另外一行“添加文件”输入框
//下面一行就是在表单中添加一数据据的行
$('#ff').append(' 文件:<input type="file" name="uploadFiles"/><br>');
}
},{
text:'关闭',
handler:function(){
$('#ff').dialog("close");//关闭对话框
}
}]
});
});
</script>
</head>
<body>
<!-- 必须将method指定为post,同时将enctype属性设置成如下形式,
第一个input中的name属性,值必须与Action中定义的Fil类型的变量名相同 -->
<form id="ff" method="post" enctype="multipart/form-data" style="padding 10px;" >
文件:<input type="file" name="uploadFile"/><br>
</form>
</body>
</html>
运行结果如下图所示。
当我们按下”附加文件“按钮时,就会出现如下图的对话框。
第三步:在项目中的action数据包中创建一个Action,Action的名称为UploadActions.java,该类继承了ActionSupper类。
第四步:单击”new->Class“命令,弹出创建类的对话框,并在Name输入框中输入UploadAction,Supperclass输入com.opensymphony.xwork2.ActionSupport。
第五步:单击”Finish“结束Action的创建。
UploadActions.java类的代码如下图所示。
package action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadActions extends ActionSupport {
// 这与表单中的上传文件域的变量名称一样
private File[] uploadFile;
// 这个由表单中上传文件域的变量名称+ContentType构成
private String[] uploadFileContentType;
// 这个由表单中上传文件域的变量名称+FileName构成
private String[] uploadFileFileName;
public File[] getUploadFile() {
return uploadFile;
}
public void setUploadFile(File[] uploadFile) {
this.uploadFile = uploadFile;
}
public String[] getUploadFileContentType() {
return uploadFileContentType;
}
public void setUploadFileContentType(String[] uploadFileContentType) {
this.uploadFileContentType = uploadFileContentType;
}
public String[] getUploadFileFileName() {
return uploadFileFileName;
}
public void setUploadFileFileName(String[] uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
}
public UploadActions() {
try {//用户设置接收信息和输出信息统一使用同一编码uft-8,可避免中文乱码
ServletActionContext.getRequest().setCharacterEncoding("utf-8");
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
} catch (Exception e) {
}
}
public String upLoad() throws IOException {
/* 假设保存的虚拟路径为/upload,通过虚拟路径去获取绝对路径 */
String realPath = ServletActionContext.getRequest().getRealPath("/upload");
/* 构造文件路径 ,这个File是java.io数据包下的File */
File file = new File(realPath);
/* 如果不存在 */
if (!file.exists()) {
file.mkdirs();
}
/* 使用struts2的工具类进行上传,第二个参数是目标文件(我们通过文件加上文件名的方式进行构建) */
try {
//采用遍历方式读所有上传的文件
for(int i=0;i<uploadFile.length;i++){
File uploadFilea=uploadFile[i];
// FileUtils类是 org.apache.commons.io数据包中的类
FileUtils.copyFile(uploadFilea, new File(file, uploadFileFileName[i]));
}
ServletActionContext.getResponse().getWriter().println("上传文件成功");
} catch (IOException e) {
ServletActionContext.getResponse().getWriter().println("上传文件失败");
}
return null;
}
}
第六步:struts.xml代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="action.LoginAction"></action>
<action name="download" class="action.DownloadAction">
<result type="stream">
<param name="inputName">InputStream</param>
<param name="contentDisposition">attachment;fileName=${fileName}</param>
</result>
</action>
<action name="upload" class="action.UploadAction" method="upLoad">
</action>
<action name="uploads" class="action.UploadActions" method="upLoad"> </action>
</package>
</struts>
第七步:选择好上传文件后,单击”上传“按钮,会相应的提示信息,如下图所示。