
测量图像长度的方式是错误的。您基本上是在将图像字节转换为人类可读的字符(按照不易理解的顺序,但不包括),然后计算字符的数量。这是不对的。您需要计算原始和未转换的字节数。一个字符不一定只用一个字节来表示,而是可以用一个以上的字节来表示。
有两种方法可以解决您的问题:
- 使用
ResultSet#getBytes()
代替。
byte[] content = resultSet.getBytes("content"); // ... response.setContentLength(content.length); response.getOutputStream().write(content);请注意,这是记忆中拱,因为每个
byte的
byte[]基本积累Java的内存的一个字节。
- 还要在查询中选择BLOB长度。如何执行取决于所使用的数据库。在MySQL中,您可以使用此
LENGTH()
功能。SELECt content, LENGTH(content) AS contentLength FROM image WHERe id = ?
然后您按以下步骤处理:
InputStream content = resultSet.getBinaryStream("content"); int contentLength = resultSet.getInt("contentLength"); // ... response.setContentLength(contentLength); SomeUtil.streamByBuffer(content, response.getOutputStream());(其中该过程不是通过byte[]
完整图片的长度进行的)
更新
:毕竟,图像上的请求似乎已经调用了
MyFacesExtensionsFilter,这显然过分地缓存了响应,而没有在
chain.doFilter()返回时适当地刷新响应。此过滤器仅在调用时才调用映射规则
FacesServlet。但这不应该发生。图像请求应该只调用了图像servlet,而不是面部servlet。
根据映射规则,在
FacesServlet上
/faces/*映射图像servlet时调用
/DisplayImage。在
<imgsrc>你已经有相对于当前请求的URL,所以它最终最终成为
/faces/DisplayImage这将首先调用
FacesServlet,然后
DisplayImageservlet的。错了
您应该相应地更改JSF代码,以便
<img src>最终成为相对于域的,从而仅调用
/DisplayImageservlet。
<img src="http://www.kaotop.com/skin/sinaskin/image/nopic.gif" />
您只需使用中的前导斜杠即可实现此目的
<h:graphicImage>。它将自动添加上下文路径。
<h:graphicImage value="/DisplayImage?mainID=drawing" />
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)