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

一、本节说明

进入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>";

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

四、小结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值