图像过大将无法加载

图像过大将无法加载,第1张

图像过大将无法加载

测量图像长度的方式是错误的。您基本上是在将图像字节转换为人类可读的字符(按照不易理解的顺序,但不包括),然后计算字符的数量。这是不对的。您需要计算原始和未转换的字节数。一个字符不一定只用一个字节来表示,而是可以用一个以上的字节来表示。

有两种方法可以解决您的问题:

  1. 使用
    ResultSet#getBytes()
    代替。
        byte[] content = resultSet.getBytes("content");    // ...    response.setContentLength(content.length);    response.getOutputStream().write(content);

请注意,这是记忆中拱,因为每个

byte
byte[]
基本积累Java的内存的一个字节。

  1. 还要在查询中选择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
,然后
DisplayImage
servlet的。错了

您应该相应地更改JSF代码,以便

<img src>
最终成为相对于域的,从而仅调用
/DisplayImage
servlet。

<img src="http://www.kaotop.com/skin/sinaskin/image/nopic.gif" />

您只需使用中的前导斜杠即可实现此目的

<h:graphicImage>
。它将自动添加上下文路径。

<h:graphicImage value="/DisplayImage?mainID=drawing" />


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5490693.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存