Java Web——文件下载getResourceAsStream()返回NULL解决方案
问题描述
严重: 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解决方案相关推荐
- Java Web文件下载
Web文件下载有两种.一种是文件在站点文件夹下.在浏览器中直接输入文件路径就可以下载.如http://www.xxx.com/file.zip.第二种是文件不在站点文件夹下或者文件是动态生成的(导出报 ...
- mybatis查询返回null解决方案
mybatis查询返回null解决方案 参考文章: (1)mybatis查询返回null解决方案 (2)https://www.cnblogs.com/zipon/p/6361661.html 备忘一 ...
- 木其工作室代写程序 [原]java web项目各种乱码的解决方案
淘宝网上专业IT程序代写 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.ne ...
- java web 文件下载
java通用文件下载 前端:简单的一个标签 <a href="../emp/OriDownload.do?fileName=421785d6-d76c-46a5-86b4-2cfcb9 ...
- java treemap get_java-TreeMap.get()返回Null,即使键存在
我试图从TreeMap获取,但即使键存在,它也会返回null. HashCode和等式仅基于单词.可比性基于频率. public static void main(){ TreeMap test = ...
- Java Web——文件下载时中文文件名乱码问题解决方案
问题描述 问题分析 浏览器匹配与编码问题. 解决方案 request.setCharacterEncoding("UTF-8");//response.setContentType ...
- getResourceAsStream 返回 null 解决经验浅谈
类名.class.getResourceAsStream("info.txt") 1直接写文件名 说明该文件和当前类是同一个包下 2写/文件名 说明该文件在src目录下 3如果两者 ...
- Java web文件下载断点续传
一.下载文件请求 @RequestMapping(value = "/file/download")@ResponseBodypublic Res download(HttpSer ...
- mysql 函数from_unixtime返回null
先说问题: mysql中表字段为releaseTime bigint(20) 存的是精确到毫秒的java timestamp. 用select from_unixtime(releaseTime) f ...
最新文章
- php请求来源,如何用PHP获取请求的来源?
- ThreadPool原理介绍
- matlab正弦序列频谱,【求助】正弦信号序列fft频谱分析!!!
- linux io体系结构,Linux IO体系结构
- mysql5.7二进制包安装
- virtual box linux 安装增强功能,Linux 开发环境中为VirtualBox安装增强功能
- 希望 线段树 01背包
- java jackson注意_Jackson注意事项
- win10 Kafka环境搭建 + 编译C++(librdkafka) 封装库
- 点餐App火爆背后的冷思考
- 静态创意和动态创意_8种独特且价格合理的名片的创意
- 一文带你了解,色环电阻失效相关知识
- Git上传项目提示Push rejected: Push to origin/dev was rejected解决办法
- 小甲鱼Python学习笔记之魔法方法
- c++ pair 用法详解
- html5拓扑图图入门,如何使用HTML5 Canvas动态的绘制拓扑图
- “电脑登录界面显示引用的账户当前已锁定”解决办法
- Weblogic之weblogic数据源配置及jndi调用
- 10 个免费的服务器监控工具
- AutoCAD .NET开发大师Kean有价值的博客 2006年8月 .NET内容整理
热门文章
- 腐蚀rust研究台抽奖_延迟焦化装置的腐蚀风险分析
- flask html下拉列表,如何使用Flask和HTML从python列表创建下拉菜单
- java 发送qq消息_php发送qq消息
- mysql 取一行_MySql – 如何获取上一行中的值和下一行中的值?
- 四十、Vue项目上手 | 用户管理系统 实现弹窗,搜索和详细页功能(下篇)
- 十九、 彻底掌握金融量化交易库Talib
- 三十五、深入Python的引用计数
- 小牛想要进大厂,距离拿百万高薪,进入AI行业你还缺哪些?
- CVPR 2020 | ActBERT: 自监督多模态视频文字学习
- MATLAB禁用!!MATLAB教程对高校全免费!!