2017-06-10 113 views
0

上的圖像我做的,它由一個Java服務器和網頁的項目。我想這樣做,當你從網上刪除一個對象時,服務器刪除與這個對象關聯的圖像。每個對象的圖像都存儲在web文件夾內的images文件夾內。但是當我嘗試在服務器上刪除的圖像,它說,該文件被另一個進程使用,因爲Web服務器的線程使用它(我用灰熊),所以我an't刪除。刪除Java服務器

//save the image 
private void saveImage(Eetakemon e){ 
    String base64Image = e.getImage().split(",")[1]; 
    byte[] imageBytes = 
javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image); 
    File imageFile = new File("WEB\\images\\" + e.getName() + ".png"); 
    try { 
     BufferedImage bufferedImage = ImageIO.read(new 
ByteArrayInputStream(imageBytes)); 
     ImageIO.write(bufferedImage, "png", imageFile); 
    } 
    catch(Exception ex){ 
     ex.printStackTrace(); 
    } 

} 

//delete the image 
private void deleteImage(Eetakemon e){ 
    try { 
     Files.deleteIfExists(Paths.get("WEB\\images\\" + e.getName() + 
".png")); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

的funcions被稱爲創建和刪除方法裏面分別

謝謝

+0

我們將需要更多的細節。我想服務器在Windows上運行,不允許刪除正在使用的文件:您可能忘記關閉閱讀器或書寫器......但提供更多模糊提示是很困難的。你可以分享你處理該文件的代碼位? (不只是你刪除它的地方) –

+0

是的,我正在使用Windows。這個問題似乎是Web服務器的線程具有圖像鎖定,我不能刪除它們,但我不知道是否有任何其他的選擇。 – kag3707

+0

在共享的2種方法中(一種是*寫*,一種是*刪除*),我沒有看到任何可以使文件保持打開的狀態(因爲ImageIO.write應該在完成時關閉文件),所以問題可能不在那裏。你有沒有另一塊代碼在*讀取文件的地方? - 你還寫了*「它說該文件被另一個進程使用」*:你能分享確切的錯誤消息,並且如果有跟蹤堆棧跟蹤嗎? –

回答

0

遇到鎖定所使用的文件的Windows屬性。您需要找到正在使用該文件的進程並關閉該資源。除非您能夠在不鎖定正在使用的文件的系統上運行,否則這是您唯一可行的選項。 Linux/Unix系統沒有這種行爲,即使它使用,它們也允許你刪除文件。

1

你應該在你的文件系統使用一個單獨的文件夾具有讀/寫訪問,並保持你的Web服務器負責提供唯一的靜態內容,例如靜態圖片,HTML,CSS和JS文件。

要處理在運行時最終可以刪除的動態圖像文件,請將業務邏輯保存在單獨的服務中,如REST API或簡單的Servlet。

您可以暫時將被刪除的圖像到一個單獨的文件夾,通過後面的預定批作業被標記爲刪除。服務的

例如刪除圖像:

public void removeFiles(List<String> fileNames) { 
    try { 
     String trashFolderLocation = ConfigurationManager.getInstance().getConfig().getImgFileTrashPath(); 
     String uploadedFileLocation = ConfigurationManager.getInstance().getConfig().getFilePath(); 

     FileUtil.moveFilesToFolder(uploadedFileLocation, trashFolderLocation, fileNames);  

    } catch(FileException e) { 
     logException(e); 
    }  
} 

在FileUtil:

public static boolean moveFilesToFolder(String locationFrom, String locationTo, List<String> fileNames) throws FileException { 
    try { 
     for (String fileName : fileNames) { 
      File afile = new File(locationFrom + fileName); 
      if (!afile.renameTo(new File(locationTo + fileName))) { 
       return false; 
      } 
     } 

    } catch (Exception e) { 
     throw new FileException(e); 
    } 
    return true; 
} 
+0

好的建議在那裏,但爲了更好的例子,你可以使用更新的[NIO.2](http://www.oracle.com/technetwork/articles/javase/nio-139333.html)來自Java 7的API,例如['Files .move'](https://docs.oracle.com/javase/tutorial/essential/io/move.html),其提供更好的選擇&更好的錯誤處理。 –

+0

使用您對Files NIO類的建議絕對更好 – guilhebl