2010-11-10 272 views
0
public void handleFileUpload(FileUploadEvent event) { 


     ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext(); 
       File result = new File(extContext.getRealPath("//admin//images") + "//" + event.getFile().getFileName()); 
      // File result = new File("D:\\Netbeans Project\\mcGrawLibPro\\mcGrawLibPro-war\\web\\item", event.getFile().getFileName()); 
       File bg = new File(extContext.getRealPath("//admin//images")+"//macback.png"); 
      try { 




        bg.renameTo(new File(extContext.getRealPath("//admin//images")+"//bg.png")); 
        File f1 = new File(extContext.getRealPath("//admin//images") + "//macback.png"); 
        result.renameTo(f1); 



       //System.out.println(f1); 
       System.out.println(result); 
       FileOutputStream fileOutputStream = new FileOutputStream(result); 

       byte[] buffer = new byte[BUFFER_SIZE]; 

       int bulk; 
       InputStream inputStream = event.getFile().getInputstream(); 
       while (true) { 
        bulk = inputStream.read(buffer); 
        if (bulk < 0) { 
         break; 
         } 
        fileOutputStream.write(buffer, 0, bulk); 
        fileOutputStream.flush(); 
        } 

        fileOutputStream.close(); 
        inputStream.close(); 

        FacesMessage msg = new FacesMessage("OK", 
         event.getFile().getFileName() + " was upload."); 
        FacesContext.getCurrentInstance().addMessage(null, msg); 

        } catch (IOException e) { 
         e.printStackTrace(); 

        FacesMessage error = new FacesMessage("Can't upload!"); 
        FacesContext.getCurrentInstance().addMessage(null, error); 
        } 
     } 

我的問題是,當我上傳的圖片類型PNG如aaa.png,它可以在服務器上載,但它不能重命名,上傳aaa.png後,我重新上傳這張照片( aaa.png)它可以更改名稱,但它有2個文件,一個是aaa.png,另一個是macback.png重命名文件

我的代碼有什麼問題?

謝謝!

+0

所以你最終只想用'bg.png'和'macback.png'完全沒有'aaa.png',對嗎? – BeemerGuy 2010-11-10 04:58:47

+0

你好Beemer,我想重命名文件上傳aaa.png到macback.png,下面的代碼我只是測試它可以從服務器上的圖像更改爲另一個名稱,然後更改圖像上傳到macback.png。如果我工作的很好,我會在服務器上刪除bg.png – MYE 2010-11-10 14:32:48

回答

1

這就是我認爲你正在嘗試做的:

  1. 當您上傳文件時,你怎麼稱呼它macback.png,而不是它的原始文件名。
  2. 當您上傳第二個文件時,您需要先將macback.png重命名爲bg.png,然後將上傳的文件保存爲macback.png。

如果是這種情況,首先需要測試macback.png文件的存在性,如果存在,則將其重命名。然後,爲macback.png文件創建一個File對象,然後打開FileOutputStream到該文件以將上傳的文件寫入到該文件中。

事情是這樣的:

public void handleFileUpload(FileUploadEvent event) { 
    ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext(); 
    File result = new File(extContext.getRealPath("//admin//images") + "//macback.png"); 
    if(result.exists()) { 
     result.renameTo(new File(extContext.getRealPath("//admin//images")+"//bg.png")); 
    } 

    try { 
     File targetFile = new File(extContext.getRealPath("//admin//images") + "//macback.png"); 

     FileOutputStream fileOutputStream = new FileOutputStream(targetFile); 
     byte[] buffer = new byte[BUFFER_SIZE]; 

     int bulk; 
     InputStream inputStream = event.getFile().getInputstream(); 
     while (true) { 
      bulk = inputStream.read(buffer); 
      if (bulk < 0) { 
       break; 
      } 
      fileOutputStream.write(buffer, 0, bulk); 
      fileOutputStream.flush(); 
     } 

     fileOutputStream.close(); 
     inputStream.close(); 

     FacesMessage msg = new FacesMessage("OK", 
     event.getFile().getFileName() + " was upload."); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 

    } catch (IOException e) { 
     e.printStackTrace(); 

     FacesMessage error = new FacesMessage("Can't upload!"); 
     FacesContext.getCurrentInstance().addMessage(null, error); 
    } 
} 
+0

謝謝Jason,但它不是我想要的,我的問題是當我上傳圖片A時,它可以在服務器上傳,但它不重命名,我必須重新上傳圖片A再一次,它意味着圖片A(2)它可以重命名爲macback.png並且它也存在圖片A,它有2張圖片A,一張是A.png,另一張則重命名爲macback.png,我的問題是爲什麼先圖片無法重命名?爲什麼第二張照片可以重新命名爲macback? – MYE 2010-11-11 05:36:40

+0

你想讓第一張圖片A重新命名爲macback.png,或者第二張圖片A(2)重新命名爲macback.png? – Jason 2010-11-11 05:45:01

0

好了,讓我們來看看,如果我得到這個時候:

  1. 你想第一A.png保存爲A.png。
  2. A.png第二次上傳時,要將第一個A.png重命名爲macback.png,將第二個A.png存儲爲A.png。

如果是這樣的話,試試這個:

public void handleFileUpload(FileUploadEvent event) { 
    ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext(); 
    File result = new File(extContext.getRealPath("//admin//images") + "//" + event.getFile().getFileName()); 
    if(result.exists()) { 
     result.renameTo(new File(extContext.getRealPath("//admin//images")+"//mackback.png")); 
    } 

    try { 
     File targetFile = new File(extContext.getRealPath("//admin//images") + "//" + event.getFile().getFileName()); 

     FileOutputStream fileOutputStream = new FileOutputStream(targetFile); 
     byte[] buffer = new byte[BUFFER_SIZE]; 

     int bulk; 
     InputStream inputStream = event.getFile().getInputstream(); 
     while (true) { 
      bulk = inputStream.read(buffer); 
      if (bulk < 0) { 
       break; 
      } 
      fileOutputStream.write(buffer, 0, bulk); 
      fileOutputStream.flush(); 
     } 

     fileOutputStream.close(); 
     inputStream.close(); 

     FacesMessage msg = new FacesMessage("OK", 
     event.getFile().getFileName() + " was upload."); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 

    } catch (IOException e) { 
     e.printStackTrace(); 

     FacesMessage error = new FacesMessage("Can't upload!"); 
     FacesContext.getCurrentInstance().addMessage(null, error); 
    } 
} 
0

我相信這個問題是你想太早重命名resultf1。在您撥打result.renameTo(f1)時,您尚未創建result引用的文件,因此重命名不起作用。在磁盤上存在文件之前,您不能重命名它。

現在,您並不需要重命名result。由於您尚未創建該文件,因此只需使用f1作爲參數FileOutputStream而不是result