问题描述
遇到一个比较诡异的问题,先说下环境:
- 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吧!
文章评论