无法在Java中创建缓存文件

6

我在我的网站上上传图片时遇到了问题。有时候可以上传,但有时也会提示 无法创建缓存文件。我该如何解决这个问题?

这是我的代码:

    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();
2个回答

7
问题:Tomcat安装在启动时失败,无法创建临时文件夹或临时文件夹不可写。

解决方案:确保\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.

1
你的代码运行在哪个安全上下文中?在一些“单个虚拟机上多个包”框架的实现中,可能存在两种类型的包,一个具有写临时文件夹权限,另一个没有。如果前者首先访问ImageIO包,则ImageIO包确定它将具有写入临时文件夹的权限,并尝试在所有后续调用中使用它,但在这样的框架中,后者也可以调用ImageIO,但会失败,因为该包无法访问临时文件。无论前者还是后者首先访问,其行为都会发生改变,如果后者首先调用ImageIO,则永远不会使用缓存目录来进行虚拟机实例,您将不会看到任何麻烦。
如果您的代码无法访问缓存目录,而某人有权访问那里并首先调用了ImageIO,则您的代码将失败。
而且,似乎您的代码将使用本地数据文件夹调用ImageIO.setCacheDirectory()。在这样的框架中,存在许多情况,其他运行在同一虚拟机上的包将无法访问您的包的本地文件夹。如果是这样,他们将不得不抛出IOException,如果您的setCacheDirectory()调用成功并且您已经给出了只有您的代码可以访问的目录。
如果您的代码成功将缓存目录设置为本地数据文件夹,其他包无法访问,则您的代码可能正常工作,但其他包在尝试使用ImageIO时会失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接