您的位置:首页 > 编程语言 > Java开发

Struts2的文件上传与下载案例

2017-08-27 13:05 363 查看

文件上传案例

upload.jsp上传页面主要代码

<body>
<form action="${pageContext.request.contextPath }/fileUploadAction" method="post" enctype="multipart/form-data">
<table align="center" width="80%">
<tr>
<td align="center">文件: <input type="file" name="file1"></td>
</tr>
<tr>
<td align="center"><input type="submit" value="上传"/></td>
</tr>
</table>
</form>
</body>


文件上传action的主要代码:

需要注意的是:这是使用的set方法

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileUpload extends ActionSupport
{
//<input type="file" name="file1">
private File file1;
//文件名
private String file1FileName;//file1为jsp标签内容,固定写法
//文件的类型(MIME)
private String fileContentType;//也是固定写法,同上
public void setFile1(File file1) {
this.file1 = file1;
}
public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception {
// 拿到上传的文件进行处理
//上传到upload目录
//获取上传的目录的路径,是通过request获取的
String path=ServletActionContext.getServletContext().getRealPath("/upload");
//创建目标文件对象
File file=new File(path,file1FileName);//file对象的拼接
//把上传的文件,拷贝到目标文件中
FileUtils.copyFile(file1, file);
return "success";
}
}


struts.xml的配置

<action name="fileUploadAction" class="cn.test.fileUpload.FileUpload">
<!--限制运行上传的文件的类型  -->
<interceptor-ref name="defaultStack">
<!--限制允许的扩展名  -->
<param name="fileUpload.allowedExtensions">txt,jpg,epub</param>
</interceptor-ref>
<result name="success">/e/success.jsp </result>
<!--配置错误视图  -->
<result name="input">/e/error.jsp</result>
</action>


到这里,文件上传的工作已经完成。(需要注意的是,这里的struts.xml是放在action所在的包里,还需要配一个全局的xml将其引入)

测试:





文件下载

对于文件下载,首先要做的就是显示要下载的信息,文件名,之后再通过jsp进行信息传递,到action去进行下载的处理。

action代码:

import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
i
4000
mport java.util.Map;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
* 文件下载
* 1.显示所有要下载的文件列表
* 2.文件下载
*
*/
public class DownAction extends ActionSupport{
/******1.显示所有要下载文件的列表*******/
public String list() throws Exception {
//得到upload目录路径
String path=ServletActionContext.getServletContext().getRealPath("/upload");
//目录对象、
File file =new File(path);
//得到所有要下载的文件的文件名
String[] fileNames= file.list();
// 保存,使用request去保存,首先要获得request对象
ActionContext ac = ActionContext.getContext();
//ac.get("request")得到 的就是requestmap,同理可得session
//得到代表request的map
Map<String, Object> request = ac.getContextMap();
request.put("fileNames", fileNames);//将字符串数组放到request域中
return "list";
}
/***********2.文件下载*****/
//1.获取要下载的文件名
private String fileName;
public void setFileName(String fileName) {
//处理传入的参数,中文乱码(get提交)
try {
//把处理好的文件名,赋值
this.fileName =new String(fileName.getBytes("ISO8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
this.fileName=fileName;
}
//2.下载提交的业务方法(在Struts.xml中配置返回stream)
public String down() throws Exception {
return "download";
}
//3.返回文件流的方法,配置文件可以使用
public InputStream getAttrInputStream(){
return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);
}
//4.下载显示的文件名(浏览器显示的文件名)
public String getDownFileName(){
//需要进行中文的编码
try {
fileName=URLEncoder.encode(fileName,"UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return fileName;
}
}


list.jsp的作用不仅是展示有哪些文件可以下载,还需要提供下载的操作,传递参数到action进行处理,通过配置文件进行跳转。主要代码如下:

<body>
<table border="1" align="center" width="80%">
<tr>
<td>编号</td>
<td>文件名</td>
<td>操作</td>
</tr>
<c:forEach var="fn" items="${fileNames}" varStatus="vs">
<tr>
<td>${vs.count }</td>
<td>${fn}</td>
<td>
<!--构建一个URL -->
<c:url var="url" value="down_down">
<c:param name="fileName" value="${fn }"></c:param>
</c:url>
<a href="${url}">下载</a>
</td>
</tr>
</c:forEach>
</table>
</body>


Struts.xml的配置:

要注意的是:在配置result的时候,如果在action没有attrInputStream为null的时候,会出现500,错误,需要检查,文件的路径,名称是否传递错误。

<action name="down_*" class="cn.test.fileUpload.DownAction" method="{1}">
<!--列表展示  -->
<result name="list">/e/list.jsp</result>
<!-- 下载操作 -->
<result name="download" type="stream">
<!--调用action 返回流的方法 -->
<!-- 允许下载文件的类型,指定为所有的二进制文件 -->
<param name="contentType">application/octet-stream</param>
<!--对应的是Action中的属性:返回流的属性【其实就是getAttrInputstream()】  -->
<param name="inputName">attrInputStream</param>
<!--下载头:包括:浏览器显示的文件名,action down 中的fileName  -->
<param name="contentDisposition">attachment;filename=${downFileName}</param>
<!--缓冲区大小设置  -->
<param name="bufferSize">1024</param>
</result>
</action>


测试:

已经在xml配置好了,这里在浏览器中需要输入的是http://localhost:8080/Test09_structs2/down_list





需要说明的是:这里的文件上传和下载是把文件上传到服务器的一个文件夹里,下载也是从服务器的文件中查找下载的,没有使用到数据库方面的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息