PrimeFaces p:graphicImage使用StreamedContent加载SVG不显示问题求助
问题解决建议
- 补充SVG正确的MIME类型声明
PrimeFacesDefaultStreamedContent默认MIME类型为application/octet-stream,浏览器无法识别为SVG资源,构造实例时必须明确指定MIME类型为image/svg+xml:
image = new DefaultStreamedContent( BckUtils.getImageManager.getImageStream(context.getExternalContext().getRequestParameterMap() , user), "image/svg+xml" );
同时你返回的defaultEmpty占位资源也需要使用相同的SVG MIME类型,避免类型不匹配导致加载失败。
- 校验流有效性
提前校验BckUtils.getImageManager.getImageStream返回的输入流是否非空、未被关闭、包含可读的SVG内容,可临时加日志输出流的available()值,或者将流写入本地文件确认SVG本身无损坏。 - 补全动态资源请求参数
p:graphicImage加载动态流时,浏览器会发起独立的HTTP请求拉取资源,原页面请求的参数不会自动携带到资源请求中,如果你拉取SVG需要依赖特定参数,需要通过<f:param>显式传入:
<p:graphicImage id="imgExpo_#{idPrefix}" value="#{bck.streamedImage}" cache="false" stream="true" > <f:param name="userId" value="#{user.id}" /> <!-- 其他getImageStream需要的参数都在此处声明 --> </p:graphicImage>
- 调整Bean作用域
如果你的bckBean是@RequestScoped,浏览器发起资源请求时原Bean已经被销毁,无法正常返回流内容,建议调整为@ViewScoped或@SessionScoped,保证资源请求生命周期内Bean可用。 - 尝试调整stream属性
PrimeFaces 7.0部分小版本存在动态SVG流的属性兼容问题,可尝试将stream="true"改为stream="false",测试是否能正常加载。
内容的提问来源于stack exchange,提问作者Riccardo Fassina
相关产品推荐
相关产品推荐

