記一次在使用ImageIO進行圖片IO操作時遇到的坑
阿新 • • 發佈:2019-02-20
之前的部落格中提到近期專案中使用到了圖片的壓縮處理,在本地tomcat上測試無任何問題,但是釋出到阿里雲伺服器上壓縮圖片卻出現了BUG,圖片生成不出來。本地的作業系統、TOMCAT和JDK版本和伺服器上一致,所以排除這些原因。可是卻怎麼也想不出還有其他什麼原因會導致圖片生成失敗了。經過查閱資料,發現有人提及到tomcat的CATALINA_TMPDIR臨時目錄,對比本地TOMCAT和伺服器上的TOMCAT,果然伺服器上的缺少temp這一臨時目錄。繼續深一步探索,發現圖片壓縮時使用到的
ImageIO.createImageOutputStream這個方法中
public static ImageInputStream createImageInputStream(Object var0) throws IOException { if(var0 == null) { throw new IllegalArgumentException("input == null!"); } else { Iterator var1; try { var1 = theRegistry.getServiceProviders(ImageInputStreamSpi.class, true); } catch (IllegalArgumentException var6) { return null; } boolean var2 = getUseCache() && hasCachePermission();ImageInputStreamSpi var3; do { if(!var1.hasNext()) { return null; } var3 = (ImageInputStreamSpi)var1.next(); } while(!var3.getInputClass().isInstance(var0)); try { return var3.createInputStreamInstance(var0, var2, getCacheDirectory()); } catch (IOException var5) { throw new IIOException("Can't create cache file!", var5);} } }
private static boolean hasCachePermission() { Boolean var0 = getCacheInfo().getHasPermission(); if(var0 != null) { return var0.booleanValue(); } else { try { SecurityManager var1 = System.getSecurityManager(); if(var1 != null) { File var2 = getCacheDirectory(); String var3; if(var2 != null) { var3 = var2.getPath(); } else { var3 = getTempDir();if(var3 == null || var3.isEmpty()) { getCacheInfo().setHasPermission(Boolean.FALSE); return false; } } String var4 = var3; if(!var3.endsWith(File.separator)) { var4 = var3 + File.separator; } var4 = var4 + "*"; var1.checkPermission(new FilePermission(var4, "read, write, delete")); } } catch (SecurityException var5) { getCacheInfo().setHasPermission(Boolean.FALSE); return false; } getCacheInfo().setHasPermission(Boolean.TRUE); return true; } }
我們可以發現這個方法會使用到TOMCAT的 CATALINA_TMPDIR,如果沒有temp這個臨時資料夾就會報錯了。
問題找到了,我們可以本地的temp檔案複製到伺服器上就OK了~