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

时间:2022-08-31 15:11:01

一、本节说明

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

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

四、小结

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