Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';无法使用ServletContext从路径获取ResourceAsStream_Java_Servlets_Nullpointerexception_Inputstream_Servletcontextlistener - Fatal编程技术网

Java Can';无法使用ServletContext从路径获取ResourceAsStream

Java Can';无法使用ServletContext从路径获取ResourceAsStream,java,servlets,nullpointerexception,inputstream,servletcontextlistener,Java,Servlets,Nullpointerexception,Inputstream,Servletcontextlistener,我有一个Servlet来处理附件的下载。我从请求中获取附加文件的路径,并尝试使用ServletContext从中获取资源作为流,但我始终将InputStream获取为null,以下是我的doGet方法: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path =

我有一个Servlet来处理附件的下载。我从请求中获取附加文件的路径,并尝试使用ServletContext从中获取资源作为流,但我始终将InputStream获取为null,以下是我的doGet方法:

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String path = request.getParameter("path");

    // Fetch File name from path and Then depending on the File extension choose
    // which ContentType using Switch structure
    Path p = Paths.get(path);
    String fileName = p.getFileName().toString();
    Optional<String> fileExtension = Optional.ofNullable(fileName).filter(f -> f.contains("."))
            .map(f -> f.substring(fileName.lastIndexOf(".") + 1));
    System.out.println("This is File Name: " + fileName);
    System.out.println("This is File Extension: " + fileExtension.orElseGet(null));

    /// Set ContentType of the HTTP header depending on the File
    /// Extensions
    switch (fileExtension.orElseGet(null).toLowerCase()) {
        case "txt":
            response.setContentType("text/plain");
            break;
        case "pdf":
            response.setContentType("application/pdf");
            break;
        case "doc":
            response.setContentType("application/msword");
            break;
        case "docx":
            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            break;
        case "xlsx":
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            break;
        case "zip":
            response.setContentType("application/zip");
            break;
        case "jpeg":
            response.setContentType("image/jpeg");
            break;
        case "jpg":
            response.setContentType("image/jpeg");
            break;
        case "png":
            response.setContentType("image/png");
            break;
        case "rar":
            response.setContentType("application/x-rar-compressed");
            break;

        default:
            break;
    }

    response.setHeader("Content-disposition", "attachment; filename=" + fileName);
    //URL url = getClass().getResource(path);
    //InputStream strm=url.openStream();

     try(InputStream in = request.getServletContext().getResourceAsStream(path);
              OutputStream out = response.getOutputStream()) {

        byte[] buffer = new byte[ARBITARY_SIZE];

        int numBytesRead;
        while ((numBytesRead = in.read(buffer)) > 0) {
            out.write(buffer, 0, numBytesRead);
        }
    }
}
protectedvoid doGet(HttpServletRequest请求,HttpServletResponse响应)
抛出ServletException、IOException{
字符串路径=request.getParameter(“路径”);
//从路径获取文件名,然后根据文件扩展名选择
//使用开关结构的内容类型是什么
路径p=Path.get(路径);
字符串文件名=p.getFileName().toString();
Optional fileExtension=Optional.ofNullable(fileName).filter(f->f.contains(“.”)
.map(f->f.substring(fileName.lastIndexOf(“.”+1));
System.out.println(“这是文件名:“+fileName”);
System.out.println(“这是文件扩展名:”+fileExtension.orElseGet(null));
///根据文件设置HTTP头的ContentType
///扩展
开关(fileExtension.orElseGet(null.toLowerCase()){
案例“txt”:
response.setContentType(“文本/普通”);
打破
案例“pdf”:
response.setContentType(“application/pdf”);
打破
案例“doc”:
response.setContentType(“应用程序/msword”);
打破
案例“docx”:
setContentType(“application/vnd.openxmlformats of cedocument.wordprocessingml.document”);
打破
案例“xlsx”:
setContentType(“application/vnd.openxmlformats of icedocument.spreadsheetml.sheet”);
打破
案例“zip”:
response.setContentType(“应用程序/zip”);
打破
案例“jpeg”:
response.setContentType(“图像/jpeg”);
打破
案例“jpg”:
response.setContentType(“图像/jpeg”);
打破
案例“png”:
response.setContentType(“image/png”);
打破
案例“rar”:
response.setContentType(“应用程序/x-rar-compressed”);
打破
违约:
打破
}
response.setHeader(“内容处置”、“附件;文件名=“+filename”);
//URL=getClass().getResource(路径);
//InputStream strm=url.openStream();
try(InputStream in=request.getServletContext().getResourceAsStream(路径);
OutputStream out=response.getOutputStream(){
字节[]缓冲区=新字节[任意大小];
int numBytesRead;
而((numBytesRead=in.read(buffer))>0){
out.write(缓冲区,0,numBytesRead);
}
}
}
以下是附件文件夹路径:


src/main/webapp
是Servlet根文件夹,即
webapp
文件夹中的文件和文件夹被复制到根目录下的
.war
文件中

要设置的
路径
参数必须与该路径相关,并且必须以
/
开头


因此,要读取该文件,您需要
path=“/resources/Attachments/new 1.txt”

此代码毫无意义。整个servlet是不必要的。只需直接链接到URL
${pageContext.request.contextPath}/resources/Attachments/new1.txt,而不是servlet的URL。除非这代表上传的文件。。然后,您需要后退一步,因为将上载的文件保存到deploy文件夹在生产环境中永远无法正常工作。好吧,我使用了以下方法:
@BalusC,您认为生产环境的更好方法是什么,感谢您提供的任何可用资源。@BalusC,非常感谢您的帮助,但在我使用时仍然有一个问题:File fileSaveDir=new File(getServletContext().getInitParameter(“File upload”);我得到了NullPointerException,尽管我在web.xml中添加了,但当我将路径硬编码如下时,它工作正常:File fileSaveDir=new File(“c:/Attachments”);