【问题标题】:Can't get ResourceAsStream from path using ServletContext无法使用 ServletContext 从路径获取 ResourceAsStream
【发布时间】:2020-12-06 15:23:52
【问题描述】:

我有一个处理附加文件下载的 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);
        }
    }
}

以下是附件文件夹路径:

【问题讨论】:

  • 这段代码没有意义。整个 servlet 是不必要的。只需直接链接到 URL ${pageContext.request.contextPath}/resources/Attachments/new1.txt 而不是 servlet 的 URL。除非这代表一个上传的文件..那么你需要退后一步,因为将上传的文件保存到部署文件夹中永远不会在生产环境中合理地工作。
  • 好吧,我已经使用了这种方法:&lt;a id="attachment-${ticket[0]}" href="${pageContext.request.contextPath}/resources/Attachments/new1.txt" class="btn btn-warning btn-sm pull-right" data-toggle="tooltip" title="Télécharger Attachement" hidden download&gt;&lt;i class="fa fa-download"&gt;&lt;/i&gt;&lt;/a&gt;
  • @BalusC,你有什么建议作为生产环境的更好方法,如果有任何可用资源,感谢提供。
  • @BalusC,非常感谢您的帮助,但我使用时仍然遇到问题: File fileSaveDir = new File(getServletContext().getInitParameter("file-upload"));我得到 NullPointerException,即使我在 web.xml 中添加了 ,当我像这样硬编码路径时它工作正常: File fileSaveDir = new File("c:/Attachments");

标签: java servlets nullpointerexception inputstream servletcontextlistener


【解决方案1】:

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

servletContext.getResourceAsStream(path)path 参数必须与该参数相关,并且必须以 / 开头。

所以要读取该文件,您需要path = "/resources/Attachments/new 1.txt"

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多