日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2024/10/5 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。