Struts2框架(五)

使用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>

第七步:选择好上传文件后,单击”上传“按钮,会相应的提示信息,如下图所示。

uploading.4e448015.gif转存失败重新上传取消

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值