- Struts上传文件总是遇到 NullPointException
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<title>课程管理</title>
</head>
<body>
<h3>上传该课程学生名单文件</h3>
<s:form action="addStudentForCourseByFileAction" method="post" enctype="multipart/form-data">
<s:file name="studentExcel" label="选择上传的文件" />
<s:submit value="上传" />
</s:form>
</body>
</html>
Action.java
public class UploadFileAction extends ActionSupport {
File upload;//上传的文件
String uploadContentType;//上传的文件类型
String uploadFileName; //上传的文件名
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName)
{
this.uploadFileName = uploadFileName;
}
public String execute()
{
System.out.println("FileName:"+this.getUploadFileName());
System.out.println("ContentType:"+this.getUploadContentType());
System.out.println("File:"+this.getUpload());
//获取要保存文件夹的物理路径(绝对路径)
String realPath= ServletActionContext.getServletContext().getRealPath("/upload");
File file = new File(realPath);
//测试此抽象路径名表示的文件或目录是否存在。若不存在,创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
if(!file.exists())
file.mkdirs();
try {
//保存文件
FileUtils.copyFile(upload, new File(file,uploadFileName));
} catch (IOException e) {
e.printStackTrace();
return "error";
}
return "success";
}
}
struts.xml (即使编译器告诉你error.jsp是红色的也没事,只要和upload.jsp在一个目录之下)
<package name="Struts2" extends="struts-default" namespace="/">
<action name="uploads" class="com.bupt.se.homework.action.UploadFileAction">
<!-- 指定(限制)上传文件的类型,定义局部拦截器,修改默认拦截器的属性
"fileUpload.maximumSize" :限制上传最大的文件大小。
"fileUpload.allowedTypes":允许上传文件的类型。
"fileUpload.allowedExtensions":允许上传文件的可扩展文件类型。 -->
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">500000000</param>
<!--<param name="fileUpload.allowedTypes">text/plain,application/vnd.ms-excel,application/octet-stream</param>-->
<param name="fileUpload.allowedExtensions">.txt,.xlsx,.csv,.xls,</param>
</interceptor-ref>
<result name="success">admin.jsp</result>
<!-- 出现错误自动会返回input结果,进入结果视图 -->
<result name="input" >error.jsp</result>
</action>
</package>
注意名称的问题!!!如果文件名叫 upload,那个获得它的类型就用 uploadContentType,获得它的文件名就用 uploadFileName。如果不这样用就无法读到它的文件名和类型,然后用它的时候就会遇到NullPointerException
- 上传的Excel文件类型一直是application/octet-stream,导致总是返回input
这个问题其实并没有解决,我只是绕开了。
其实就是把struts.xml中的allowedTypes那一行注释掉,或者加入application/octet-stream。只要最后保存文件的时候使用excel就没事。