2

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

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

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

我有路径,例如:

  • /home/website/images/image1.png

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

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

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

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


更新 (26/03/2013)

我发现了这种处理这个问题的方法:

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

谢谢BalusC!哈哈哈哈哈

4

2 回答 2

2

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

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

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

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>
于 2012-05-09T02:51:28.930 回答
0

从您在 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 识别服务器上的资源是不正确的,并且不起作用。

于 2012-05-09T02:51:18.850 回答