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">

            
            <interceptor-ref name="defaultStack">
                <param name="fileUpload.maximumSize">500000000param>
                
                <param name="fileUpload.allowedExtensions">.txt,.xlsx,.csv,.xls,param>
            interceptor-ref>

            <result name="success">admin.jspresult>
            
            <result name="input" >error.jspresult>
        action>
    package>

注意名称的问题!!!如果文件名叫 upload,那个获得它的类型就用 uploadContentType,获得它的文件名就用 uploadFileName。如果不这样用就无法读到它的文件名和类型,然后用它的时候就会遇到NullPointerException

  • 上传的Excel文件类型一直是application/octet-stream,导致总是返回input
    这个问题其实并没有解决,我只是绕开了。
    其实就是把struts.xml中的allowedTypes那一行注释掉,或者加入application/octet-stream。只要最后保存文件的时候使用excel就没事。

你可能感兴趣的:(web)