SSH框架開發過程中遇到的BUG總結——Struts2文件上傳的問題

  • 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就沒事。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章