以下是“struts2单个文件上传的两种实现方式”的完整攻略。
一、前置条件
在实现struts2单个文件上传之前,需要确保已经具备以下条件:
-
确保已经配置好struts2的web.xml和struts.xml文件,以及struts2的相关jar包。
-
确保已经在jsp页面中添加了文件上传组件input标签,例如:
<input type="file" name="upload"/>
二、第一种实现方式(基于Servlet的文件上传)
1. 创建Servlet
在项目中创建一个Servlet类,例如:
@WebServlet("/uploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取传入参数
String description = request.getParameter("description"); // 获取描述信息
// 获取上传的文件
Part filePart = request.getPart("upload");
String fileName = getSubmittedFileName(filePart);
InputStream fileContent = filePart.getInputStream();
// TODO: 文件操作代码
// 跳转到成功页面
request.getRequestDispatcher("/success.jsp").forward(request, response);
}
private String getSubmittedFileName(Part part) {
for (String content : part.getHeader("content-disposition").split(";")) {
if (content.trim().startsWith("filename")) {
return content.substring(content.indexOf("=") + 2, content.length()-1);
}
}
return null;
}
}
其中,@WebServlet注解指定了Servlet的访问路径,@MultipartConfig注解指定了该Servlet可以处理multipart/form-data类型的请求,即文件上传请求。
2. 添加struts2相关配置
在struts.xml中添加以下配置:
<package name="fileUpload" namespace="/" extends="struts-default">
<action name="uploadAction" class="com.example.action.UploadAction">
<interceptor-ref name="fileUploadStack"/>
<result name="success">/success.jsp</result>
</action>
</package>
其中,fileUpload指定了该包的名字,UploadAction是处理上传请求的Action类名。fileUploadStack是struts2默认的文件上传拦截器栈,已经包含了文件上传所需的拦截器和过滤器。
3. 编写UploadAction类
在项目中创建一个UploadAction类,作为处理上传的Action类,例如:
public class UploadAction extends ActionSupport {
private File upload; // 上传文件对象
private String uploadContentType; // 上传文件的Content-Type值
private String uploadFileName; // 上传文件的文件名
// setter和getter方法省略
@Override
public String execute() throws Exception {
// TODO: 文件操作代码
return SUCCESS;
}
}
其中,upload、uploadContentType和uploadFileName分别对应jsp页面中input标签的name、Content-Type值和文件名。
4. 编写文件上传jsp页面
在jsp页面中添加以下代码:
<s:form action="uploadAction" method="POST" enctype="multipart/form-data">
<s:textfield name="description" label="文件描述"/>
<s:file name="upload" label="选择文件"/>
<s:submit value="上传文件"/>
</s:form>
其中,action指定了上传文件的Action类名,input标签的name属性应该和UploadAction类中的属性名对应。
三、第二种实现方式(基于Commons-fileupload的文件上传)
1. 添加相关依赖
在项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
2. 添加struts2相关配置
在struts.xml中添加以下配置:
<package name="fileUpload" namespace="/" extends="struts-default">
<action name="uploadAction" class="com.example.action.UploadAction">
<interceptor-ref name="fileUpload"/>
<result name="success">/success.jsp</result>
</action>
</package>
其中,fileUpload指定了该包的名字,UploadAction是处理上传请求的Action类名。fileUpload是struts2中负责文件上传的拦截器,需要手动添加。
3. 编写UploadAction类
在项目中创建一个UploadAction类,作为处理上传的Action类,例如:
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
public class UploadAction extends ActionSupport {
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
// 检查是否文件上传表单
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
// 创建文件上传处理工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 解析上传请求
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
// 处理表单域
if (item.isFormField()) {
String fieldName = item.getFieldName();
String fieldValue = item.getString("UTF-8");
// TODO: 进行表单域的操作
}
// 处理上传文件
else {
String fileName = item.getName();
String contentType = item.getContentType();
long sizeInBytes = item.getSize();
InputStream fileContent = item.getInputStream();
// TODO: 进行文件上传的操作
}
}
}
return SUCCESS;
}
}
4. 编写文件上传jsp页面
在jsp页面中添加以下代码:
<form action="uploadAction" method="POST" enctype="multipart/form-data">
<input type="text" name="description" placeholder="文件描述"/>
<input type="file" name="fileUpload"/>
<button type="submit">上传文件</button>
</form>
其中,action指定了上传文件的Action类名。
到这里,就介绍完了struts2单个文件上传的两种实现方式的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2单个文件上传的两种实现方式 - Python技术站