- 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就沒事。