2011-11-09 45 views
0

我在eclipse中使用jsf2.0 ide.I在本地文件夾中存儲圖像時出現問題。圖像存儲在0字節的本地文件夾中。圖像被讀取並寫入0字節。系統找不到在jsf2.0中指定的文件

輔助Bean:

公共類uploadImageAction {

public void handleFileUpload(FileUploadEvent event) throws IOException { 


    FacesContext context = FacesContext.getCurrentInstance(); 
    PhotoBean photoBean = (PhotoBean) context.getApplication().evaluateExpressionGet(context, "#{photoBean}", PhotoBean.class); 
    PhotoBean photoBean2 = (PhotoBean) context.getApplication().evaluateExpressionGet(context, "#{photoBean2}", PhotoBean.class); 

    ExternalContext extContext=FacesContext.getCurrentInstance().getExternalContext(); 

    File file = new File(extContext.getRealPath(event.getFile().getFileName())); 


     System.out.println("Hibernate save image into database"); 
     Session session = HibernateUtil1.getSessionFactory().openSession(); 

     session.beginTransaction(); 

     //save image into database 
     //File file = new File("D:\\1.gif"); 
     //byte[] bFile = new byte[(int) file.length()]; 
     //System.out.println("DDDDDDDDDDDD"+bFile); 

     byte[] bfile = new byte[(int)file.length()]; 
     System.out.println("DDDDDDDDDDDD"+bfile); 
     try { 
      FileInputStream fileInputStream = new FileInputStream(file); 
      //convert file into array of bytes 
      fileInputStream.read(bfile); 
      fileInputStream.close(); 
      } catch (Exception e) { 
       System.out.println("Cannnoy"); 
      e.printStackTrace(); 
      } 

     String urlImage = file.toString(); 

     String imageName = event.getFile().getFileName(); 


     photoBean.setPathName(file); 

     //file = photoBean.getPathName(); 

     photoBean.setImageName(imageName); 

     imageName = photoBean.getImageName(); 

     photoBean.setUrl(urlImage); 

     urlImage = photoBean.getUrl(); 


    // PhotoDaoService photoDaoService = new PhotoDaoService(); 

     System.out.println("+++++++++++++++++++++++++"+file); 


System.out.println("CHECK BYTES"+bfile); 
    // uploadImageBean upldImageBean = new uploadImageBean(); 
     //upldImageBean.setImageByte(bfile); 
     photoBean.setByteImage(bfile); 
     //avatar.setImage(bFile); 
     // System.out.println("dfdffdf"+upldImageBean.setImageByte(bFile)); 


     session.save(photoBean); 


     //Get image from database 
     photoBean2 = (PhotoBean)session.get(PhotoBean.class, photoBean.getId()); 
     byte[] bImage = photoBean2.getByteImage(); 
     System.out.println("QQQQQQQQQQQQQQQ"+bImage); 
     int i=0; 
     try{ 
      FileOutputStream fos = new FileOutputStream("e:/out/out"+0+".jpg"); 
      fos.write(bImage); 
      fos.close(); 
      FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() 
        + " is uploaded."); 

        FacesContext.getCurrentInstance().addMessage(null, msg); 
     }catch(Exception e){ 
      e.printStackTrace(); 
      System.out.println("UPLOAD DISPLAY EXCEPTION"); 
     } 

     session.getTransaction().commit(); 
    } 

} 

錯誤發生時:

Hibernate save image into database 
bytes[[email protected] 
java.io.FileNotFoundException: E:\Mecherie_project\.metadata\.plugins \org.eclipse.wst.server.core\tmp0\wtpwebapps\image_web\baby.jpg (The system cannot find the file specified) 

at java.io.FileInputStream.open(Native Method) 
at java.io.FileInputStream.<init>(FileInputStream.java:120) 
at image.uploadImageAction.handleFileUpload(uploadImageAction.java:45) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.sun.el.parser.AstValue.invoke(AstValue.java:234) 
+0

_「圖像存儲在0字節的本地文件夾中,圖像讀取和寫入0字節。」_這是什麼意思? –

+0

@Matt:OP以某種方式期待上傳的文件由'File'神奇地呈現,如'new File(extContext.getRealPath(event.getFile()。getFileName()));'所示。 OP正試圖使用​​'FileInputStream'來讀取它,這顯然不會工作,因爲該文件不存在。 – BalusC

回答

3

作爲回答這樣manytimesbefore,你應該店/找到上傳的文件在公共網絡內容中。您應該使用絕對路徑。例如。

File file = new File("/path/to/images", filename); 
// ... 

上傳的文件是不是奇蹟般地出現在展開的WAR,所以用FileInputStream閱讀它不會在所有的工作。您必須從event.getFile().getInputStream()中讀取它,然後將其寫入任意OutputStream,例如FileOutputStream

但是現在你的真的問題比你以前的問題更明確。您似乎想要將上傳的文件保存在數據庫中。然後不需要先將文件存儲在本地磁盤文件系統上。只需將接收到的字節直接傳輸到byte[]並將其保存在數據庫中。

InputStream input = event.getFile().getInputstream(); 
ByteArrayOutputStream output = new ByteArrayOutputStream(); 
byte[] buffer = new byte[1024]; 

for (int length; (length = input.read(buffer)) > -1;) { 
    output.write(buffer, 0, length); 
} 

photoBean.setByteImage(output.toByteArray()); 
+0

BalusC感謝您的回覆,顯然我需要的是,每當我上傳圖片時,它必須保存在服務器的任何文件夾中,可能是「\ images」或其他東西,並且已保存圖片的鏈接必須保存在數據庫,我現在沒有問題,數據庫正確保存在我的表中。但真正的問題是在藉助該鏈接檢索圖像的同時,我的圖像文件保存爲0字節文件,並且它顯示爲十字標記。 – Muthu

+0

那是因爲你沒有通過'event.getFile()。getInputStream()'讀取上傳的圖像。您剛剛創建了一個不存在的文件,然後嘗試從中讀取它。 – BalusC

+0

嗨baluc我得到了結果,謝謝你的支持..它非常有用.. – Muthu

相關問題