在ResourceAwareController.handleResourceRequest方法中为portlet响应使用不同的内容类型(image / png)?

时间:2016-02-24 05:49:31

标签: spring image spring-mvc portlet spring-portlet-mvc

我想通过portlet实现动态生成的图像(图表)。 为此,我扩展了org.springframework.web.portlet.mvc.ResourceAwareController类并使用public ModelAndView handleResourceRequest (final ResourceRequest request, final ResourceResponse response)方法实现了资源请求处理。

代码类似于以下内容:

   public ModelAndView handleResourceRequest (final ResourceRequest request, final ResourceResponse response) throws Exception{

        if some condition {
        try {
            response.reset ();
        } catch (Exception e) {
            e.printStackTrace ();
        }
        .
        .
        .

        final JFreeChart chart = createStatisticsChart (xyDataSet, period, stats.size ());
        final BufferedImage bi = chart.createBufferedImage (700, 430);

        if (null != bi) {
            response.setContentType ("image/png");
            OutputStream out;
            out = response.getPortletOutputStream ();

            final Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName ("png");
            if (iter.hasNext ()) {
                final ImageWriter writer = iter.next ();
                final ImageWriteParam iwp = writer.getDefaultWriteParam ();
                final MemoryCacheImageOutputStream mos = new MemoryCacheImageOutputStream (out);
                writer.setOutput (mos);
                final IIOImage image = new IIOImage (bi, null, null);
                writer.write (null, image, iwp);
            }
        } 
        .
        .
        .

        return null;
        }
        else some conditions {
            .
            .
            return new ModelAndView (returnPath)
        }
    }

使用portlet资源URL完成此操作。 但是我总是得到这个图像的“text / html”输出,尽管在上面的方法中,我将portlet响应的内容类型设置为“image / png”。因此,我得到一个奇怪的字符作为输出,而不是正确的图表图像。

PNGIHDR rL N。}IDATx oh\wz @) R &gt;X RJ J ad J 2v Z “ ٟ DB f Ԥ n %, S fMvY7B ,!b l +c VX+ 6R 8 F3Ҍ Ҍ s Fg&gt; s y&amp;M 3v P ^ ` ˿ ˿ ӯ ʯ 499y z 5 # &lt; j ^} _H W ~ } _ߣj~ { (x _L .............

请告诉我如何在使用资源网址时正确地将Portlet响应的内容类型更改为“image / png”内容类型。 (请注意,对于某些条件,上述方法应返回“text / html”)

更新 我得到了图像数据的编码字符串,而不是图像数据的预期原始字节。事实证明,当portlet调用servlet时,outputStream实际上并不是普通的OutputStream。 response.getOutputStream()返回org.apache.pluto.container.util.PrintWriterServletOutputStream的一个对象,它实际上使用了一个编码器,它使用这个OutputStream对我们编写的任何数据进行编码。因此,尽管我期望从图像中获取原始字节,但我得到了图像字节的编码字符串。

新问题: 是否可以覆盖PrintWriterServletOutputStream的write方法来写入原始字节而不是编码的字符串?

0 个答案:

没有答案