【问题标题】:Showing image with absolute path in JSP在 JSP 中显示具有绝对路径的图像
【发布时间】:2012-05-17 13:28:07
【问题描述】:

我正在使用 Java、JSP 和 Jetty 开发网站。

我在<img> 标签的 src 中传递的图像路径有一些问题。

在我的数据库中,我有用户图像的 Linux 绝对路径。我得到这个值并放入“src”属性中。

我有路径,例如:

  • /home/website/images/image1.png

这样一来,图像就不会出现。 想了很久,我得出的结论是很自然的,因为我从来没有在任何网站图像中看到过这样的路径到操作系统的绝对路径。

我需要知道的是我必须做什么?

我必须更改 Jetty 的配置吗? 我必须在 Java 中运行一些代码吗?

通过谷歌搜索,我更加困惑。我想要一个解释。


更新(2013 年 3 月 26 日)

我找到了处理这个问题的方法:

http://balusc.blogspot.com.br/2007/04/imageservlet.html

谢谢BalusC!哈哈哈哈哈

【问题讨论】:

    标签: java image jsp path jetty


    【解决方案1】:

    确实,<img src> 必须引用公共 Web URL,而不是本地磁盘文件系统路径。您的图像必须通过 HTTP 请求可用。即必须下载它们的是网络浏览器,而不是必须以某种方式包含它们的网络服务器。

    对于初学者来说,最直接的方法是创建一个 servlet,它根据请求参数或路径信息由FileInputStreamInputStream 的形式获取图像内容,然后以通常的 Java IO 方式将其写入OutputStream HttpServletResponse,在设置了必要的 HTTP 响应标头以便浏览器了解如何处理它之后。

    例如,假设 servlet 映射到 /images/* 并且您以 http://example.com/contextpath/images/image1.png 打开图像:

    String filename = request.getPathInfo();
    File file = new File("/home/website/images", filename);
    
    response.setHeader("Content-Type", getServletContext().getMimeType(filename));
    response.setHeader("Content-Length", String.valueOf(file.length()));
    
    InputStream input = new FileInputStream(file);
    OutputStream output = response.getOutputStream();
    // Stream bytes the usual way.
    

    另一种方法是将/home/website/images 作为新的Web 应用程序上下文添加到具有/images 上下文路径的服务器。这样,http://example.com/images/image1.png 就可以使用图像了。你只需要依赖 servletcontainer 的 make/version 如何配置它,以及你是否拥有完全的管理员控制权。对于 Jetty,如果您以编程方式对其进行管理,则如下所示:

    server.setHandler(new WebAppContext("/home/webapp/images", "/images"));
    

    或者当您通过 XML 管理它时:

    <Configure class="org.eclipse.jetty.webapp.WebAppContext">
        <Set name="resourceBase">/home/website/images</Set>
        <Set name="contextPath">/images</Set>
    </Configure>
    

    【讨论】:

    • 太棒了!关于第一个解决方案,假设我有太多图像,那不是效率不高吗?关于我更喜欢​​的 2º 解决方案,我将在哪里设置这个新的 WebAppContext?我也可以在 xml 文件中执行此操作吗?非常感谢!! =]
    • 我在 context.xml 中的代码和你提到的一样,但是没有用……你确定吗?
    • 抱歉,&lt;Set name="webApp"&gt; 必须是 &lt;Set name="resourceBase"&gt;。至于第一种解决方案的效率,它并不比流式传输更差,但它不尊重浏览器缓存请求。
    • 感谢您的更新!我已经更新了我的 context.xml 文件,但我仍然没有得到图像。 (本来应该是通过example.com/im/image1.png获取图片的,但是还是看不到/im文件夹,图片也没有出现……我绝望了……
    • 对不起,我不使用 Jetty。我只是根据它的文档来回答。
    【解决方案2】:

    从您在 URI 中使用的词来看,您似乎将文件系统上文件的路径放在 src 属性中,而不是唯一标识资源的 URL。

    绝对路径在您的文件系统中不是绝对的,它们是从您的 Web 服务器的根目录开始的绝对路径。此外,这些 URL 资源标识符甚至可以更改或修改以映射到服务器中的不同文件夹甚至是动态资源。

    这是一个例子:

    服务器上文件的路径:

    /home/website/images/image1.png
    

    example.com 映射到“网站”文件夹:

    使用相对 URL 时,您可能会看到:

    <img src="/images/image1.png" />
    

    要使用绝对 URL,您需要 HTTP 方案:

    <img src="http://example.com/images/image1.png" />
    

    总而言之,使用文件路径从客户端 HTML 中识别服务器上的资源是不正确的,不会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多