与Jetty服务图像的奇怪

时间:2009-07-25 18:40:56

标签: servlets png jetty md5 lift

我完全难过了。为了这个,我会给出背景信息 完整性,但我不确定它是否会有所帮助。我在运行一个Lift实例的标准Jetty设置上运行Lift项目。 Mac OS X。

我有一个代码片段,用于转换XML输入,呈现图像,将其保存到webroot / images /目录下的光盘中,其中包含来自内容的MD5的文件名,例如 “c5669d3eedcf7d305dcf9f88a61b3ee0.png”。然后,该片段返回一个img标记,其中包含对生成的图像的引用,以包含在输出中。

大多数时候大多数图像都有效。但大部分时间他们中的一些人没有,有些图像不是由浏览器呈现的。试图在浏览器中查看问题图像(Camino和Firefox)不起作用:图像不显示,表明某些内容有些错误。

在另一个浏览器(Safari和QuickTime)中查看,图像正常。下载和打开图像工作正常。当使用Camino直接查看文件时(即文件:// ...),图像显示正常:文件本身并未明显损坏。

它不能是文件名的长度,因为所有文件名都是相同的37个字符。

我只能假设通过Jetty服务时图像的传输出了问题。

失败的URI,一致地失败,它不是间歇性的。重启Jetty没什么区别,所以我不认为文件是在服务器启动后创建的。此外,渲染是一个阻塞调用,因此文件仍然无法打开/ 在发送HTML并且浏览器请求图像之前,尚未保存。

我唯一可以想象的是MIME类型被破坏了,所以我把适当的映射放在web.xml中但仍然没有雪茄。 MIME类型看起来没问题,我已经验证了字节数是否正确。

问题图片:

HTTP/1.1 200 OK
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: JSESSIONID=1dbeh8eq4mtu0;Path=/
Content-Type: image/png
Content-Length: 25488
Last-Modified: Sat, 25 Jul 2009 15:38:19 GMT
Server: Jetty(6.1.16)

为了完整性,图片中的标题可以正常加载:

HTTP/1.1 200 OK
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: JSESSIONID=15dt649lzovc4;Path=/
Content-Type: image/png
Content-Length: 18657
Last-Modified: Sat, 25 Jul 2009 15:41:35 GMT
Server: Jetty(6.1.16)

非常对此感到困惑。有线索吗?

干杯

3 个答案:

答案 0 :(得分:1)

我不确定您以后是从curl / wget测试URL,还是使用数据包嗅探器获取标头,但以防万一。我尝试使用HTTPScoop之类的工具来验证发送到Firefox的实际数据是否符合预期数据。

唯一让我印象深刻的是尺寸差异。通常较大的图像会失败吗?如果是这样,我会说它的某种破坏缓冲/刷新文件。

答案 1 :(得分:1)

我有类似的问题。对我而言,看起来Jetty将图像视为文本,并尝试将其编码为UTF-8。我制作的测试数据只包含7位数据并且工作得很好,但是当数据包含设置了第8位的字节时,它会像UTF-8编码一样转换为多个字节。

由于PNG文件始终以字节0x89,0x50,0x4e,0x47开头,当由破坏的Jetty设置提供服务时,第一个0x89将转换为0xef,0xbf,0xbd。这是UTF-8代码0xfffd,其中AFAIK表示“错误的UTF字符”或其他内容。

我认为它必须是环境中的东西,因为相同的设置可以在我自己的Mac和Linux机器上运行,但在其他Linux机器和一台Windows机器上经常出现故障。

答案 2 :(得分:0)

你是在服用JAR吗?我有同样的问题,但只有PNG具有透明层,并且只有在JAR服务时才有。如果我对它进行卷曲,它会立即弹出100%,但会继续“下载”,直到达到30秒超时。