下面是java中struts2实现文件上传下载功能的完整攻略:
一、文件上传功能的实现
1. 安装文件上传插件
在struts2中实现文件上传功能需要依赖文件上传插件,可以通过以下方式进行安装:
- 在
pom.xml
中加入以下依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
其中struts.version
是struts的版本号,可以自己设置。
- 在struts.xml中配置文件上传的拦截器:
<interceptors>
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
<param name="maximumSize">20971520</param><!-- 20MB -->
</interceptor>
<interceptor-stack name="defaultStack">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="params">
<param name="excludeParams">.*</param>
</interceptor-ref>
<interceptor-ref name="servletConfig"></interceptor-ref>
<interceptor-ref name="prepare"></interceptor-ref>
<interceptor-ref name="chain"></interceptor-ref>
<interceptor-ref name="debugging"></interceptor-ref>
<interceptor-ref name="profiling"></interceptor-ref>
<interceptor-ref name="scopedModelDriven"></interceptor-ref>
<interceptor-ref name="modelDriven"></interceptor-ref>
<interceptor-ref name="fileUpload"></interceptor-ref>
<interceptor-ref name="checkbox"></interceptor-ref>
<interceptor-ref name="multiselect"></interceptor-ref>
<interceptor-ref name="staticParams"></interceptor-ref>
<interceptor-ref name="actionMappingParams"></interceptor-ref>
<interceptor-ref name="params"></interceptor-ref>
<interceptor-ref name="conversionError"></interceptor-ref>
</interceptor-stack>
</interceptors>
2. 实现文件上传的Action
- 创建一个实体类FileItem:
public class FileItem {
private String fileName; // 文件名
private String fileType; // 文件类型
private String filePath; // 文件存放路径
// 省略Getter和Setter
}
- 创建文件上传的Action类:
public class FileUploadAction extends ActionSupport {
private static final long serialVersionUID = -3192370127539117633L;
private File file; // 上传的文件,用File对象接收
private String fileContentType; // 文件类型
private String fileFileName; // 文件名
// 注意:这里的变量名要与struts.xml中的参数名保持一致
private List<FileItem> fileItems; // 已上传文件列表
// 省略Getter和Setter
public String upload() {
// 获取上传文件的保存路径
String savePath = ServletActionContext.getServletContext().getRealPath("/upload");
// 若保存路径不存在,则创建该路径
File fileDir = new File(savePath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
// 生成UUID作为文件名,防止重名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String ext = fileFileName.substring(fileFileName.lastIndexOf(".")); // 获取文件扩展名
File targetFile = new File(savePath, uuid + ext);
try {
FileUtils.copyFile(file, targetFile); // 复制上传的文件到目标文件
addActionMessage("上传成功!");
} catch (IOException e) {
e.printStackTrace();
}
return SUCCESS;
}
/**
* 获取已上传的文件列表
*/
public String fileList() {
String savePath = ServletActionContext.getServletContext().getRealPath("/upload");
File file = new File(savePath);
File[] files = file.listFiles();
fileItems = new ArrayList<>();
if (files != null) {
for (File f : files) {
FileItem fi = new FileItem();
fi.setFileName(f.getName());
fi.setFilePath(f.getAbsolutePath());
fi.setFileType(f.getName().substring(f.getName().lastIndexOf(".") + 1));
fileItems.add(fi);
}
}
return SUCCESS;
}
}
- 在struts.xml中配置文件上传的action:
<action name="fileupload" class="org.example.FileUploadAction" method="upload">
<result name="success">/WEB-INF/views/success.jsp</result>
<result name="input">/WEB-INF/views/input.jsp</result>
</action>
3. 实现文件上传的页面
- 创建上传文件的表单页面input.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>文件上传示例</title>
</head>
<body>
<s:form action="fileupload" method="post" enctype="multipart/form-data">
<s:file name="file" label="选择文件:"/>
<s:submit value="上传"/>
</s:form>
</body>
</html>
- 创建上传成功页面success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>上传成功</title>
</head>
<body>
上传成功!
<s:a href="filelist.action">查看已上传的文件</s:a>
</body>
</html>
4. 文件上传功能的示例演示
在浏览器中访问/upload/input.jsp,选择一个文件并点击“上传”按钮即可完成文件上传,上传成功后会跳转到上传成功的页面。点击“查看已上传的文件”链接可以进入到已上传文件列表页面。
二、文件下载功能的实现
1. 实现文件下载的Action
- 创建文件下载的Action类:
public class FileDownloadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String filePath; // 文件路径
// 省略Getter和Setter
public InputStream getFileStream() {
return ServletActionContext.getServletContext().getResourceAsStream(filePath);
}
/**
* 下载文件的方法
* @return
* @throws Exception
*/
public String download() throws Exception {
return SUCCESS;
}
}
- 在struts.xml中配置文件下载的action:
<action name="filedownload" class="org.example.FileDownloadAction" method="download">
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">fileStream</param>
<param name="contentDisposition">attachment;filename=${fileName}</param>
<param name="bufferSize">1024</param>
</result>
</action>
其中,param
标签的contentDisposition
属性指定了下载文件时的文件名,${fileName}
是在action中设置的文件名。
2. 实现文件下载的页面
- 创建文件下载链接的列表页filelist.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>文件上传示例</title>
</head>
<body>
<table>
<thead>
<tr>
<th>文件名</th>
<th>文件类型</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<s:iterator value="fileItems">
<tr>
<td><s:property value="fileName"/></td>
<td><s:property value="fileType"/></td>
<td><s:a href="filedownload.action?filePath=<s:property value='filePath'/>&fileName=<s:property value='fileName'/>">下载</s:a></td>
</tr>
</s:iterator>
</tbody>
</table>
</body>
</html>
其中,<s:a>
标签中的filedownload.action
是文件下载的action,filePath
是下载文件的路径,而fileName
则是下载时的文件名。
3. 文件下载功能的示例演示
在浏览器中访问/filelist.action,点击某个文件的“下载”链接,即可下载该文件到本地。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中struts2实现文件上传下载功能 - Python技术站