问题描述

严重: Servlet.service() for servlet [club.zstuca.demo.DownloadDemo] in context with path [/DEMOWeb] threw exception
java.lang.NullPointerExceptionat club.zstuca.demo.DownloadDemo.doGet(DownloadDemo.java:48)at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Unknown Source)

问题分析

文件不在WebAPP根目录下,导致找不到资源。

API

Class.getResourceAsStream(String path)

JDK设置这样的规则,是很好理解的,path不以“/”开头时,我们就能获取与当前类所在的路径相同的资源文件,而以“/”开头时可以获取classPath根下任意路径的资源。

path不以“/”开头时,默认是从当前类所在的包下面获取资源

path以“/”开头时,则是从项目的classPath根下获取资源

ClassLoader.getResourceAsStream(String path)

默认是从classpath根下获取,path不能以“/”开头,path是指类加载器的加载范围,在资源加载的过程中,使用逐级向上的委托的形式加载的,“/”表示Boot ClassLoader中的加载范围,因为这个类加载器是C++实现的,所以加载范围为null。

ServletContext.getResourceAsStream(String path)

默认从WebAPP根目录下取资源,Tomcat下path是否以“/”开头无所谓,当然这和具体的容器实现有关。

解决方案

1、在WebAPP根目录下创建res文件夹,将资源移入此文件夹

2、修改代码

源代码

package club.zstuca.demo;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class DownloadDemo*/
@WebServlet("/DownloadDemo")
public class DownloadDemo extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public DownloadDemo() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubrequest.setCharacterEncoding("UTF-8");//response.setContentType("application/octet-stream");response.addHeader("content-Type", "application/octet-stream" );String filename = request.getParameter("filename");response.addHeader("content-Disposition", "attachment; filename=" + filename);//response.getWriter().append("Served at: ").append(request.getContextPath());InputStream in = this.getServletContext().getResourceAsStream("/res/" + filename);System.out.println("res/" + filename);System.out.println(in);ServletOutputStream out = response.getOutputStream();byte[] bs = new byte[1024];int len = -1;while((len=in.read(bs))!=-1) {out.write(bs,0,len);}out.close();   }/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

参考文章

http://www.imooc.com/wenda/detail/593313

https://www.cnblogs.com/lebo0425/p/6607804.html

Java Web——文件下载getResourceAsStream()返回NULL解决方案相关推荐

  1. Java Web文件下载

    Web文件下载有两种.一种是文件在站点文件夹下.在浏览器中直接输入文件路径就可以下载.如http://www.xxx.com/file.zip.第二种是文件不在站点文件夹下或者文件是动态生成的(导出报 ...

  2. mybatis查询返回null解决方案

    mybatis查询返回null解决方案 参考文章: (1)mybatis查询返回null解决方案 (2)https://www.cnblogs.com/zipon/p/6361661.html 备忘一 ...

  3. 木其工作室代写程序 [原]java web项目各种乱码的解决方案

    淘宝网上专业IT程序代写 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.ne ...

  4. java web 文件下载

    java通用文件下载 前端:简单的一个标签 <a href="../emp/OriDownload.do?fileName=421785d6-d76c-46a5-86b4-2cfcb9 ...

  5. java treemap get_java-TreeMap.get()返回Null,即使键存在

    我试图从TreeMap获取,但即使键存在,它也会返回null. HashCode和等式仅基于单词.可比性基于频率. public static void main(){ TreeMap test = ...

  6. Java Web——文件下载时中文文件名乱码问题解决方案

    问题描述 问题分析 浏览器匹配与编码问题. 解决方案 request.setCharacterEncoding("UTF-8");//response.setContentType ...

  7. getResourceAsStream 返回 null 解决经验浅谈

    类名.class.getResourceAsStream("info.txt") 1直接写文件名 说明该文件和当前类是同一个包下 2写/文件名 说明该文件在src目录下 3如果两者 ...

  8. Java web文件下载断点续传

    一.下载文件请求 @RequestMapping(value = "/file/download")@ResponseBodypublic Res download(HttpSer ...

  9. mysql 函数from_unixtime返回null

    先说问题: mysql中表字段为releaseTime bigint(20) 存的是精确到毫秒的java timestamp. 用select from_unixtime(releaseTime) f ...

最新文章

  1. php请求来源,如何用PHP获取请求的来源?
  2. ThreadPool原理介绍
  3. matlab正弦序列频谱,【求助】正弦信号序列fft频谱分析!!!
  4. linux io体系结构,Linux IO体系结构
  5. mysql5.7二进制包安装
  6. virtual box linux 安装增强功能,Linux 开发环境中为VirtualBox安装增强功能
  7. 希望 线段树 01背包
  8. java jackson注意_Jackson注意事项
  9. win10 Kafka环境搭建 + 编译C++(librdkafka) 封装库
  10. 点餐App火爆背后的冷思考
  11. 静态创意和动态创意_8种独特且价格合理的名片的创意
  12. 一文带你了解,色环电阻失效相关知识
  13. Git上传项目提示Push rejected: Push to origin/dev was rejected解决办法
  14. 小甲鱼Python学习笔记之魔法方法
  15. c++ pair 用法详解
  16. html5拓扑图图入门,如何使用HTML5 Canvas动态的绘制拓扑图
  17. “电脑登录界面显示引用的账户当前已锁定”解决办法
  18. Weblogic之weblogic数据源配置及jndi调用
  19. 10 个免费的服务器监控工具
  20. AutoCAD .NET开发大师Kean有价值的博客 2006年8月 .NET内容整理

热门文章

  1. 腐蚀rust研究台抽奖_延迟焦化装置的腐蚀风险分析
  2. flask html下拉列表,如何使用Flask和HTML从python列表创建下拉菜单
  3. java 发送qq消息_php发送qq消息
  4. mysql 取一行_MySql – 如何获取上一行中的值和下一行中的值?
  5. 四十、Vue项目上手 | 用户管理系统 实现弹窗,搜索和详细页功能(下篇)
  6. 十九、 彻底掌握金融量化交易库Talib
  7. 三十五、深入Python的引用计数
  8. 小牛想要进大厂,距离拿百万高薪,进入AI行业你还缺哪些?
  9. CVPR 2020 | ActBERT: 自监督多模态视频文字学习
  10. MATLAB禁用!!MATLAB教程对高校全免费!!