图片生成失败, Can’t create output stream!

  • Post author:
  • Post category:其他



遇到一个奇葩问题,分析报告的图片在测试环境上不显示,但在alicloud和本机上是正常的。

分析了下, 首先将 ChartUtilities.writeChartAsPNG()改为ChartUtilities.writeChartAsJEPG();把图片格式改为jepg,发现图片还是显示不了。
连上远程桌面,发现生成图片的时候后台报错:

Can’t create output stream。

查找发现也有人遇到同样的问题,看完文档http://feitianbenyue.iteye.com/blog/1743281。

终于找到原因,生成图片的时候要用到io流,会读取变量

java.io.tmpdir!如果没有自定义路径,默认读取路径是tomcat下的temp文件夹。



当temp文件夹不存在时,就会出现”

Can’t create output stream”。图片生成失败,自然就无法正常显示。





以下是文档中附上的源码。




  1. private


    static


    boolean

    hasCachePermission() {

  2. Boolean hasPermission = getCacheInfo().getHasPermission();



  3. if

    (hasPermission !=

    null

    ) {


  4. return

    hasPermission.booleanValue();

  5. }

    else

    {


  6. try

    {

  7. SecurityManager security = System.getSecurityManager();


  8. if

    (security !=

    null

    ) {

  9. File cachedir = getCacheDirectory();

  10. String cachepath;



  11. if

    (cachedir !=

    null

    ) {

  12. cachepath = cachedir.getPath();

  13. }

    else

    {

  14. cachepath = getTempDir();



  15. if

    (cachepath ==

    null

    ) {

  16. getCacheInfo().setHasPermission(Boolean.FALSE);


  17. return


    false

    ;

  18. }

  19. }


  20. security.checkWrite(cachepath);

  21. }

  22. }

    catch

    (SecurityException e) {

  23. getCacheInfo().setHasPermission(Boolean.FALSE);


  24. return


    false

    ;

  25. }


  26. getCacheInfo().setHasPermission(Boolean.TRUE);


  27. return


    true

    ;

  28. }

  29. }



  1. /**



  2. * Returns the default temporary (cache) directory as defined by the



  3. * java.io.tmpdir system property.



  4. */



  5. private


    static

    String getTempDir() {

  6. GetPropertyAction a =

    new

    GetPropertyAction(

    “java.io.tmpdir”

    );


  7. return

    (String)AccessController.doPrivileged(a);

  8. }

tomcat 启动的时候显示

  1. Using CATALINA_BASE:   /home/appuser/appservers/tomcat-feilong

  2. Using CATALINA_HOME:   /home/appuser/appservers/tomcat-feilong

  3. Using CATALINA_TMPDIR: /home/appuser/appservers/tomcat-feilong/temp

  4. Using JRE_HOME:        /usr/lib/jvm/java-

    6

    -sun

  5. Using CLASSPATH:       /home/appuser/appservers/tomcat-feilong/bin/bootstrap.jar



版权声明:本文为xiaojunjuns1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。