Вопрос по java, jsf – Получить корневой путь веб-приложения в управляемом компоненте JSF

9

Я пытаюсь получить доступ кexample/web папка (см. ниже на изображении) в управляемом bean-компоненте jsf, но, кажется, не могу найти способ сделать это

Im trying to access the **example/web** folder (see below in the image) in a jsf managed bean but cant seem to find a way to do it

Спасибо

Ваш Ответ

4   ответа
14

Если хочешь получить какFile по какой-то причине, тогда тебе нужноExternalContext#getRealPath(). Это преобразует относительный веб-путь в абсолютную файловую систему диска. Поскольку вам нужна корневая папка в Интернете, просто введите/:

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

Unrelatedля решения конкретной проблемы, независимо от того, какое функциональное требование вы имели в виду, для которого вы полагали, что наличие абсолютного локального пути файловой системы на диске к веб-папке является правильным решением, оно, безусловно, должно быть решено иначе. И действительно, согласно вашему комментарию к другому ответу,

потому что я пытаюсь загрузить какой-нибудь файл в папку и использую относительный путь

ты идешь по неверному пути. Вы не должны хранить загруженные файлы там, если вы намерены хранить их дольше, чем время развертывания веб-приложения. Каждый раз, когда вы повторно развертываете веб-приложение (и на некоторых конфигурациях сервера, даже когда вы перезапускаете сервер), загруженные файлы будут полностью потеряны, просто потому, что они не содержатся как часть исходного файла WAR. Более того, некоторые тяжелые конфигурации сервера вообще не расширяют WAR на диске, а в памяти, вместоgetRealPath() всегда будет возвращатьnull.

Скорее храните это висправлен путь к файловой системе диска вне папки развертывания сервера. В свою очередь добавьте этот путь в качестве нового серверного контекста или документа, чтобы он был доступен по другому (виртуальному) контекстному пути. Или доморощенный сервлет, который получаетInputStream с диска и записывает наOutputStream ответа. Смотрите также этот связанный ответ: Загруженное изображение доступно только после обновления страницы

спасибо за ответ, я буду искать немного больше о хранении изображений и вернусь, если у меня возникнут вопросы hari
16

Пытатьс

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

для построения относительных URL-адресов к ресурсам в вашем приложении.

Если ты хочешь реальный путь ...

ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
            .getExternalContext().getContext();
String realPath = ctx.getRealPath("/");
хорошо, спасибо, но возможно ли получить абсолютный путь, потому что я пытаюсь загрузить какой-то файл в папку и используя относительный путь, я получаю java.io.FileNotFoundException: \ example (доступ запрещен) hari
Я добавил дляrealPath Paul Vargas
0

Пытаться

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

чтобы получить реальный путь.

Создайте файл tmp в ресурсах / temp /, чтобы избежать каких-либо исключений.

0

на сервере Tomcat / Tomee у меня следующий код, который работает:

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;
  }

Похожие вопросы