Struts2项目实战 微云盘(七):文件上传下载

来源:互联网 发布:淘宝站外活动有哪些 编辑:程序博客网 时间:2024/04/24 05:38

一、本节说明

进入github下载本项目(开源)
本节主要实现文件上传与下载功能。

二、文件上传

1.控制器实现
文件上传的基本知识可以查看我的另一篇博文struts2实现文件上传(一)
这里的UploadAction在整体上与那一篇中的实现方法是一致的,不过还要在那个基础上添加一些东西。
那篇博文的UploadAction只做了一件事情:

  • 用户上传文件后UploadAction将其保存在uploadFiles文件夹下

在该项目中用户上传文件后需要做三件事情:

  • 用户上传文件后UploadAction将其保存在uploadFiles文件夹下,与上面那个控制器一致
  • 在该用户的指定路径下添加该文件结点
  • 返回该用户指定路径下的所有孩子集合

为什么上传文件还要求有返回值?
因为我用AJAX提交请求,提交成功我想获取到该路径下的孩子结点然后显示出来,这样就可以实现上传文件即时显示。

因为代码是重复的,所以这里只说有区别的地方

//添加一个属性,保存返回的结果private List<DirNode> dirNodes=new ArrayList<DirNode>();//省略setter、getter方法
@Override    public String execute() throws Exception {        //获取待保存文件的位置的输出流        //获取上传文件的输入流        //不断将输入流中的数据写入输出流        // 获取用户账号和密码        //将文件与用户关联起来        ServiceImpl serviceImpl=new ServiceImpl();        DirNode dirNode=serviceImpl.findNode(username, password,dirPath);        dirNode.getChilds().add(new DirNode(uploadFileName, false,savePath+"/"+uploadFileName));        //设置返回结果        setDirNodes(dirNode.getChilds());        //返回 成功标志        return SUCCESS;    }}

2.Action配置
UploadAction返回值仍然为JSON,所以还应该在lzf2包下配置该Action

<!-- 文件上传 --><action name="uploadAction" class="cn.lzf.action.UploadAction">    <param name="savePath">uploadFiles</param>    <result name="error">/WEB-INF/content/login.jsp</result>    <result type="json">            <param name="noCache">true</param>            <param name="contentType">text/html</param>    </result></action>

3.js请求文件上传
关于文件上传UI的优化以及AJAX发起请求在上一节已经介绍过了,这里不再细说。

三、文件下载

1.控制器实现
以下是控制器的实现代码,虽然代码很长,但是看过之后你会发现有用的也就几行:

//注意这个文件名是getTargetFile()//所以在stream结果中应该配置//<param name="inputName">targetFile</param>public InputStream getTargetFile() throws Exception {        return ServletActionContext.getServletContext().getResourceAsStream(inputPath);    }    @Override    public String execute() throws Exception {        //对用户身份验证        ActionContext ctx = ActionContext.getContext();        String username = (String) ctx.getSession().get("username");        if (username != null)            return SUCCESS;        return LOGIN;    }

以下是控制器的完整代码:

package cn.lzf.action;import java.io.InputStream;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;/** * 文件下载控制器 *  * @author Administrator 刘壮飞 * */public class DownloadAction extends ActionSupport {    //文件路径    private String inputPath;    //下载之后的文件名    private String fileName;      public String getFileName() {          return fileName;      }      public void setFileName(String fileName) {          this.fileName = fileName;      }      public void setInputPath(String inputPath) {        this.inputPath = inputPath;    }    public String getInputPath() {        return inputPath;    }    public InputStream getTargetFile() throws Exception {        return ServletActionContext.getServletContext().getResourceAsStream(inputPath);    }    @Override    public String execute() throws Exception {        //对用户身份验证        ActionContext ctx = ActionContext.getContext();        String username = (String) ctx.getSession().get("username");        if (username != null)            return SUCCESS;        return LOGIN;    }}

2.控制器配置
DownloadAction返回值不是JSON,所以在lzf包下对其进行配置。

<!-- 文件下载 --><action name="downloadAction" class="cn.lzf.action.DownloadAction">    <result type="stream">        <param name="inputName">targetFile</param>        <param name="contentType">text/plain</param>        <param name="contentDisposition">attachment;fileName="${fileName}"</param>        <param name="bufferSize">4096</param>    </result>    <result name="login">/WEB-INF/content/login.jsp</result></action>

3.js请求文件下载

在parseData(data)方法中可以发现有如下代码片段:

//如果该节点是文件,那么给它设置下载链接if(url!=null) html+="<a href=\"downloadAction?inputPath="+url+"&fileName="+name+"\">" + name + "</a></div>";

用户点击该链接后会弹出下载框。

四、小结

整个项目已经接近尾声了,下一节主要介绍异常还有项目中出现的问题

原创粉丝点击