Java Servlet PNG图像输出显示损坏(未完全传输)

时间:2014-07-14 10:58:11

标签: java servlets flush corrupt

我在几天前开发的Java servlet出现问题,最后将其上传到我的测试应用服务器。

首先我将描述Servlet的作用:基本上它通过使用两个参数创建一个网站计数器:第一个参数是用户名标识符(用户名),第二个参数是一个整数标识,用于标识背景图像和设计应该是应用于计数器,以便用户可以更改使用的计数器设计而不会丢失其计数。我使用Java servlet通过以下步骤生成PNG文件:

  1. 从数据库加载计数器和设计以获取数据
  2. 将背景图像从PNG图像源文件加载到BufferedImage
  3. 使用指定的字体xPos,yPos,字体大小等将当前计数器值绘制到背景图像。
  4. 将BufferedImage作为PNG文件写入servlet输出流,指定内容类型为PNG。
  5. 这里的问题是将生成的图像不完整(!)。我做了一个同花顺和关闭输出流购买无论如何它仍然是不完整的。我还试图省略我在BufferedImage的Graphics2D上绘制任何内容的所有修改,但它根本没有帮助。当我在独立应用程序中运行相同的代码库时,输出图像就可以了,所以我不认为ImageIO或我的通用代码存在问题。

    也许我错过了servlet输出声明中的一些强制性内容,但我无法自己找到错误。

    这是真正运行的应用程序:

    http://csz-online.net:8080/CounterBuilder/CounterServlet?name=clemens&layout=61

    正如您所看到的文件不完整!例如Firefox显示它收到的PNG内容,但是如果我下载文件Eye of Gnome例如根本不显示损坏的文件!独立应用程序创建的相同图像已完成,工作正常。

    谢谢!

    这是Java servlet processRequest方法的代码,它将在post和get上执行。由于我目前没有原始源代码,这就是JD-GUI输出的内容。除了方法结尾的异常处理外,它看起来很相似:

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
      {
        ServletContext cntx = getServletContext();
        try
        {
          String creationStr = request.getParameter("layout");
          long cId = Long.valueOf(creationStr).longValue();
          String name = request.getParameter("name");
    
          Counter counter = this.counterFacade.findByNickname(name);
          Creation creation = this.creationFacade.find(Long.valueOf(cId));
    
          String filename = cntx.getRealPath(creation.getBackground());
          if (filename == null) {
            throw new FileNotFoundException("BG not found: " + creation.getBackground());
          }
          String mime = cntx.getMimeType(filename);
    
          int cCounter = counter.getCounter() + 1;
    
          response.setContentType(mime);
          File file = new File(filename);
          response.setContentLength((int)file.length());
          OutputStream out = response.getOutputStream();Throwable localThrowable4 = null;
          try
          {
            String fontStr = creation.getFont();
            BufferedImage image = ImageIO.read(file);
            BufferedImage[] digits = new BufferedImage[10];
    
            image.flush();
            switch (fontStr)
            {
            case "gold": 
              Graphics2D g = image.createGraphics();
              digits[0] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/0.png")));
              digits[1] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/1.png")));
              digits[2] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/2.png")));
              digits[3] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/3.png")));
              digits[4] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/4.png")));
              digits[5] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/5.png")));
              digits[6] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/6.png")));
              digits[7] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/7.png")));
              digits[8] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/8.png")));
              digits[9] = ImageIO.read(new File(cntx.getRealPath("images/digits/gold/9.png")));
              drawNumbersToImage(g, digits, cCounter, creation.getxPos(), creation.getyPos());
              break;
            default: 
              Font font = new Font(creation.getFont(), 0, creation.getFontSize());
              FontRenderContext frc = new FontRenderContext(null, true, true);
              TextLayout layout = new TextLayout(String.valueOf(cCounter), font, frc);
              Graphics2D h = image.createGraphics();
              h.setColor((Color)Color.class.getField(creation.getColor()).get(null));
              layout.draw(h, creation.getxPos(), creation.getyPos());
              h.dispose();
            }
            counter.setCounter(cCounter);
            this.counterFacade.edit(counter);
    
            ImageIO.write(image, "PNG", out);
    
            out.flush();
            out.close();
          }
          catch (Throwable localThrowable1)
          {
            localThrowable4 = localThrowable1;throw localThrowable1;
          }
          finally
          {
            if (out != null) {
              if (localThrowable4 != null) {
                try
                {
                  out.close();
                }
                catch (Throwable x2)
                {
                  localThrowable4.addSuppressed(x2);
                }
              } else {
                out.close();
              }
            }
          }
        }
        catch (IOException|NoSuchFieldException|SecurityException|IllegalArgumentException|IllegalAccessException ex)
        {
          ex.printStackTrace();
    
          response.setContentType("text/HTML");
          PrintWriter writer = response.getWriter();Throwable localThrowable3 = null;
          try
          {
            writer.print("Could not generate counter due to missing or invalid parameters <b>bg</b> and <b>name</b>.");
          }
          catch (Throwable localThrowable2)
          {
            localThrowable3 = localThrowable2;throw localThrowable2;
          }
          finally
          {
            if (writer != null) {
              if (localThrowable3 != null) {
                try
                {
                  writer.close();
                }
                catch (Throwable x2)
                {
                  localThrowable3.addSuppressed(x2);
                }
              } else {
                writer.close();
              }
            }
          }
        }
      }
    

0 个答案:

没有答案