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