2010-11-10 325 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