最近做网站需要用到网页上传文件的问题,于是决定用commons-fileupload来实现,
首先需要引入必要的struts2必要包,这里就不列出来了。
上传图片的网页代码如下:
<form action="test1.jsp" name="form1" method="post" enctype="multipart/form-data" >
手机图片:<input type="file" name="img" /><br/>
请上传图片<input type="submit" value="提交图片" /></td>
</form>
test1.jsp网页代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。
if (isMultipart == true) {
FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
//检查当前项目是普通表单项目还是上传文件。
if (item.isFormField()) {//如果是普通表单项目,显示表单内容。
String fieldName = item.getFieldName();
if (fieldName.equals("name")) //对应demo1.html中type="text" name="name"
out.print("the field name is" + item.getString());//显示表单内容。
out.print("<br>");
} else {//如果是上传文件,显示文件名。
out.print("the upload file name is" + item.getName());
out.print("<br>");
}
}
} else {
out.print("the enctype must be multipart/form-data");
}
%>
<html>
<body>
</body>
</html>
这里上传文件的话正常会输出 文件的名字。
但是由于struts2会拦截所有请求,由于一些原因导致网页没有接受到文件。
于是上网查了一些资料,要求在struts2里面添加一行代码
<constant name="struts.action.excludePattern" value="/system/page/test1.jsp" />
便好用了,但是 首先声明,这个value里的属性,应该添加项目名称后面的字符串,比如我在把鼠标移动到上传文件的时候便会出现网页跳转的网页提示,我的事
localhost:8080/phoneSales/system/page/test1.jsp
其中的phoneSales是项目名称,你只需要在value里添加/system/page/test1.jsp中,便能成功让struts过滤器不过滤这个请求,这里特别强调,因为我就是因为这个原因导致耗费了一下午的时间找资料,你一定要将value填加正确,否则他也会无法正常运行。如果这样还是不行的话,我建议你将你的struts-core-x.xxx.x.jar的文件提升到struts-core-2.1.8.1.jar以上版本,网上说可能这个版本之后才支持,不过我没测试出来,这里只是提示一下。
希望能帮到大家,别像我一样浪费了大量时间在这种错误上。