2012-04-30 21 views

Trả lời

13

Nếu bạn muốn nhận được nó như là một File đối với một số lý do, sau đó bạn cần ExternalContext#getRealPath(). Điều này chuyển đổi đường dẫn web tương đối thành hệ thống tệp đĩa tuyệt đối. Kể từ khi bạn cần thư mục gốc của web, chỉ cần vượt qua trong /:

String absoluteWebPath = externalContext.getRealPath("/"); 
File webRoot = new File(absoluteWebPath); 
// ... 

Không liên quan cho vấn đề cụ thể, bất cứ yêu cầu chức năng bạn đã có trong tâm trí mà bạn nghĩ rằng có một đĩa địa phương tuyệt đối đường dẫn hệ thống tập tin vào thư mục web là giải pháp đúng, nó chắc chắn nhất sẽ được giải quyết khác nhau. Và trên thực tế, theo nhận xét của bạn về câu trả lời khác,

vì Im cố gắng để tải lên một số tập tin bên trong thư mục và sử dụng đường dẫn tương đối

bạn đang đi sai đường. Bạn không nên lưu trữ các tệp đã tải lên trong đó nếu bạn dự định giữ chúng lâu hơn thời gian triển khai của webapp. Bất cứ khi nào bạn triển khai lại webapp (và trên một số máy chủ cấu hình ngay cả khi bạn khởi động lại máy chủ), các tệp đã tải lên sẽ bị mất hoàn toàn, đơn giản vì chúng không được chứa như một phần của tệp WAR ban đầu. Thậm chí nhiều hơn, một số cấu hình máy chủ nặng không mở rộng WAR trên đĩa, nhưng thay vào đó, trong bộ nhớ, getRealPath() sẽ luôn trả lại null.

Thay vì lưu trữ nó trong cố định đường dẫn hệ thống tệp đĩa bên ngoài thư mục triển khai của máy chủ. Thêm đường dẫn đó lần lượt như bối cảnh máy chủ mới hoặc docroot, để nó có thể truy cập trên một đường dẫn ngữ cảnh (ảo) khác. Hoặc gia đình một servlet lấy InputStream của nó từ đĩa và ghi nó vào OutputStream của phản hồi. Xem thêm câu trả lời liên quan này: Uploaded image only available after refreshing the page

+0

cảm ơn câu trả lời của bạn, Ill tìm kiếm thêm một chút về lưu trữ hình ảnh và quay lại nếu tôi có bất kỳ câu hỏi nào – hari

16

Hãy thử

FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath() 

cho xây dựng của url so với nguồn lực trong ứng dụng của bạn.

Nếu bạn muốn con đường thực ...

ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance() 
      .getExternalContext().getContext(); 
String realPath = ctx.getRealPath("/"); 
+0

tốt đẹp, cảm ơn nhưng có thể có được đường dẫn tuyệt đối, vì cố gắng tải lên một số tệp trong thư mục và sử dụng người thân đường dẫn Im nhận java.io.FileNotFoundException: \ example (Truy cập bị từ chối) – hari

+0

Tôi đã thêm cho 'realPath' –

0

Hãy thử:

String relativePath="/resources/temp/"; 
String absolutePath= FacesContext.getCurrentInstance.getExternalContext().getRealPath(relativePath); 
File file = new File(absolutePath); 

để có được con đường thực sự.

Tạo tệp tmp trong tài nguyên/tạm thời/để tránh bất kỳ ngoại lệ nào.

0

Chỉ muốn cảm ơn Balus C.Mã Java với JSP, trong máy chủ Tomcat/Tomee Tôi mã sau hoạt động:

private Boolean SaveUserItemImage(Part ui, String bid) throws IOException { 

    Boolean fileCreate = false; 
    OutputStream out = null; 
    InputStream filecontent = null; 
    ExternalContext ctx = context().getExternalContext(); 
    String absoluteWebPath = ctx.getRealPath("/"); 
    String resource_path = absoluteWebPath + "\\resources\\"; 
    String image_path = resource_path + "\\" + this.itemType + "_images\\"; 
    String buildFileName = image_path + bid + "_" + getFileName(ui); 
    File files = null; 

    try { 
     files = new File(buildFileName); 
     fileCreate = true; 
    } catch (Exception ex) { 
     System.out.println("Error in Creating New File"); 
     Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    if (fileCreate == true) { 
     if (files.exists()) { 
     /// User may be using same image file name but has been editted 
     files.delete(); 
     } 

     try { 
     out = new FileOutputStream(files); 
     filecontent = ui.getInputStream(); 
     int read = 0; 
     final byte[] bytes = new byte[1024]; 
     while ((read = filecontent.read(bytes)) != -1) { 
      out.write(bytes, 0, read); 
     } 
     fileCreate = true; 
     } catch (FileNotFoundException fne) { 
     fileCreate = false; 
     Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, "SaveUserItemImage", fne); 
     } finally { 
     if (out != null) { 
      out.close(); 
     } 
     if (filecontent != null) { 
      filecontent.close(); 
     } 
     files = null; 
     } 
    } 
    return fileCreate; 
    } 
Các vấn đề liên quan