1. 程式人生 > >記一次在使用ImageIO進行圖片IO操作時遇到的坑

記一次在使用ImageIO進行圖片IO操作時遇到的坑

之前的部落格中提到近期專案中使用到了圖片的壓縮處理,在本地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了~