ITPub博客

首页 > 数据库 > 数据库开发技术 > 文件上传时空指针异常解析

文件上传时空指针异常解析

原创 数据库开发技术 作者:Finally_m 时间:2023-07-17 12:32:55 0 删除 编辑

戳下方卡片,回复暗号【Java面试题】即可获取大厂面试题



 异常现象


我们知道,文件上传是企业开发中很常见的一个功能,但有些朋友在文件上传时经常会遇到一些异常情况,今天我们就来分析一下常见的空指针异常。

比如最近九哥有个学生,在使用Servlet提供的Part接口实现文件上传时,就遇到了空指针异常NullPointerException,该异常可以说是java开发中最为常见的,但不同场景下却有着截然不同的解决方案。



 异常原因


通过调试,我们发现表单数据在后台Servlet中无法被获取到,所有字段全部为null值。



这个现象是怎么产生的呢?后来九哥查看了Part接口进行文件上传的API方法及其使用步骤,发现文档中要求我们,必须在实现文件上传的Servlet上添加一个@MultipartConfig注解,否则服务器代码就无法使用 getPart()方法,同时y也会影响普通字段的数据获取。



 解决办法


为了解决上述问题,我们在使用Part接口实现文件上传时需要注意以下事项:

1.前端页面表单必须使用post请求方式;

2.表单的form标签中必须添加enctype="multipart/form-data",如下图所示:



前端实例代码如下所示:

<%--
     此处必须注意:
     1. method="post"提交方式必须使用post
     2. enctype="multipart/form-data" 添加属性,且值必须是multipart/form-data
--%>
<form action="addbook" method="post" enctype="multipart/form-data">
    <table border="1px" cellpadding="10" cellspacing="0" align="center">
        <caption>
            <h2>添加图书信息</h2>
        </caption>
        <tr>
            <td>书名:</td>
            <td><input type="text" name="title"></td>
        </tr>
        <tr>
            <td>价格:</td>
            <td><input type="text" name="price"></td>
        </tr>
        <tr>
            <td>作者:</td>
            <td><input type="text" name="author"></td>
        </tr>
        <tr>
            <td>封面:</td>
            <td><input type="file" name="pic"></td>
        </tr>
        <tr>
            <td>图书简介:</td>
            <td>
                <textarea name="desc" cols="40" rows="5"></textarea>
            </td>
        </tr>
        <tr align="center">
            <td colspan="2">
                <input type="submit" name="sub">
                <input type="reset" name="ret">
            </td>
        </tr>
    </table>
</form>


3.还要在实现文件上传的Servlet中添加@MultipartConfig注解:


@WebServlet("/addbook")
@MultipartConfig
public class BookServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决请求和响应的中文乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取字段属性的值
        String title = req.getParameter("title");
        String price = req.getParameter("price");
        String author = req.getParameter("author");
        String desc = req.getParameter("desc");
        //调用getPart("pic")方法获取Part对象,注意参数为页面中file表单元素的name属性名
        Part part = req.getPart("pic");
        //获取上传文件名
        String fileName = part.getSubmittedFileName();
        //解决命名冲突问题
        String pic = UUID.randomUUID()+fileName;
        //拼接上传文件路径
        String path ="E:\\path\\"+ pic;
        //上传操作
        part.write(path);
        //构建图书对象
        Book bk = new Book(title,Double.parseDouble(price),author,pic,desc);
        BookService bs = new BookService();
        //调用业务层方法完成添加新图书操作
        int row = bs.addBook(bk);
        if (row>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        }
    }
}


只要大家按照以上步骤,我们就可以解决文件上传时的空指针异常了,现在你学会了吗?关注Java架构栈,干货天天都不断哦!


近期课程上新:
Java基础 | Javaweb基础 | Java高级框架 | 微服务架构 | TiDB分布式数据库入门最佳实践 | VUE全面剖析及前后端联动实战 | 23种设计模式 | 企业级项目实战 | Java面试宝典

原文作者:Java架构栈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-04-13

  • 博文量
    573
  • 访问量
    243797