【问题标题】:Can’t create cache file in Java无法在 Java 中创建缓存文件
【发布时间】:2017-05-06 13:25:40
【问题描述】:

我无法在我的网站上上传图片。有时,它会上传。但有时它也会显示can’t create cache file。我该如何解决?

这是我的代码:

    File file = new File(imagePath);
    BufferedImage bi;
    try{
        bi = ImageIO.read(file);
    }catch(javax.imageio.IIOException e){
        if(request.getParameter("fi") != null){
            file = new File(context.getInitParameter("ImgPath") + "placeholder/150x80.png");
        }else if (request.getParameter("li") != null){
            file = new File(context.getInitParameter("ImgPath") + "placeholder/150x80.png");
        }

        bi = ImageIO.read(file);
    }

    OutputStream outImg = response.getOutputStream();
    File cacheDir = new File(context.getInitParameter("ImgPath") + "cache");
    try {
        ImageIO.setCacheDirectory(cacheDir);
        ImageIO.write(bi, "png", outImg);
    } catch (Exception ex) {

    }

    outImg.close();

【问题讨论】:

    标签: java caching servlets file-upload


    【解决方案1】:

    问题:您的 tomcat 安装未能在启动时创建 temp 文件夹或临时文件夹不可写.

    解决方案: 确保 temp 文件夹存在于 \temp 下且可写。

    您可以手动创建它。

    或者

    您可以通过在catalina.bat (windows) 或catalina.sh (linux) 中设置CATALINA_TMPDIR 环境变量的值覆盖默认 Tomcat 的临时文件夹位置。

    #   CATALINA_TMPDIR (Optional) Directory path location of temporary directory
    #                   the JVM should use (java.io.tmpdir).  Defaults to
    #                   $CATALINA_BASE/temp.
    

    【讨论】:

      【解决方案2】:

      您的代码在哪个安全上下文中?在“单个虚拟机上的多个包”框架的某些实现中,可以存在两种类型的包,一种具有写入临时文件夹的权限,另一种没有。如果前者先访问 ImageIO 包,ImageIO 包确定它有权限写入 temp 文件夹,并尝试使用它所有后续调用,但是,在这样的框架中,后者也可以调用 ImageIO,它会失败,因为该捆绑包无权访问临时文件。行为会改变,前者会先访问,反之亦然,如果后者先调用 ImageIO,它将永远不会为该虚拟机实例使用缓存目录,您不会看到任何问题。

      • 如果您的代码无权访问缓存目录并且有权访问该目录的人首先调用 ImageIO,您的代码将失败。

      而且,您的代码似乎会使用您的本地数据文件夹调用 ImageIO.setCacheDirectory()。在这样的框架中,在很多情况下,在同一虚拟机上运行的其他包将无法访问您的包的本地文件夹。如果是这样,如果您的 setCacheDirectory() 调用成功并且您提供了只有您的代码可以访问的目录,他们将不得不抛出 IOException。

      • 如果您的代码成功地将缓存目录设置为其他包无法访问的本地数据文件夹,您的代码可能会正常工作,但尝试使用 ImageIO 时其他包会失败。

      【讨论】:

        猜你喜欢
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2020-10-18
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多