2

这是我正在尝试做的事情:

在我的 spring 控制器中,当收到请求时,我正在动态生成一个图表。我想在生成图表时在 HttpServletResponse 的 OutputStream 中设置一个图像,如“加载时请稍候”。

现在发生的情况是浏览器收到“加载时请稍候”,但从未更新到实际图表。我调试了代码并将图表写入OutputStream,但浏览器没有加载它。

我不能有客户端脚本。

谢谢

@RequestMapping("/img/**")
public void img(HttpServletRequest request, HttpServletResponse response, ChartRequest request) {

        ServletOutputStream os = null;
        try {
            os = response.getOutputStream();
            response.setContentType("image/png");    
                     os.write(base64PNGToByte(ImageContainer.PNG_PLEASE_WAIT)); // here is the "PLEASE WAIT WHILE LOADING" image
            os.flush(); // browser receives the image

                ChartResponse chartResponse = chartManager.processChart(request);
                if (!chartResponse .isSuccess()) {
                    os.write(base64PNGToByte(null));
                    return;
                }

                String base64Img = chartResponse .getResponse();
                os.write(base64PNGToByte(base64Img)); // the generated chart image, but browser does not shows this image...
            } else {
                os.write(base64PNGToByte(null));
            }

            os.flush();
        } catch (IOException e) {
            logger.debug("img: IOException ", e);
        }
    }
4

1 回答 1

3

一个 servlet 不能像你想要的那样生成两个不同的响应。

但是,将<img>背景设置为静态的“请稍候”图像会更容易,居中;当生成实际图像时,背景将被覆盖:

<img src="your/dynamic/url?data=123"
   style="background-image: url('path/to static/please-wait.png');
   background-position: 50% 50%; background-repeat: no-repeat;"
/>

(样式可能需要调整,但沿着这些思路是可行的)

于 2013-09-12T13:12:46.920 回答