[Java]ImageIO.write在mount了NFS的文件夹用普通权限User运行后产生FileNotFoundException/Permission denied解决办法

2021-05-30 1408点热度 0人点赞 0条评论

问题描述

遇到一个比较诡异的问题,先说下环境:

  • Tomcat服务器是运行在普通的user下的(非root帐号),例如tomcat用户帐号
  • 我们在服务器上mount了NFS的存储(版本v4,/storage目录)

Tomcat跑的一个程序调用:

File file = new File("/storage/a.jpg");// /storage是一个nfs mount过来的文件夹
BufferedImage bufferedImage = // 得到bufferImage并处理的逻辑,省略
ImageIO.write(bufferedImage, "JPEG", file);// 报 FileNotFoundException: /storage/test.jpg (Permission denied)

总是报如下错误:

java.io.FileNotFoundException: /storage/test.jpg (Permission denied)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:216)
    at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:53)
    at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:37)
    at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:393)
    at javax.imageio.ImageIO.write(ImageIO.java:1514)
    at com.terrynow.test.Main.main(Main.java from InputFileObject:12)
Exception in thread "main" java.lang.NullPointerException
    at javax.imageio.ImageIO.write(ImageIO.java:1523)
    at com.terrynow.test.Main.main(Main.java from InputFileObject:12)

方法尝试:

  • /storage权限设置成777:chmod 777 /storage  --继续报错
  • 保存的文件路径换成非NFS mount的地方,--不报错了
  • 使用root运行程序 --不报错了

最后的解决办法

ImageIO.write换了另一个方法,参数是FileOutputStream就可以了:

File file = new File("/storage/a.jpg");
BufferedImage bufferedImage = // 得到bufferImage并处理的逻辑,省略
FileOutputStream fileOutputStream = new FileOutputStream(file);
ImageIO.write(bufferedImage, "JPEG", fileOutputStream); // 用这个方法就可以了!
fileOutputStream.close();

比较诡异,估计参数是文件的方法,处理过程有bug吧!

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论