Загружать изображения из папки webapps / webcontext / deploy с помощью тега или

Мне нужно отображать изображения, которые находятся за пределами папки развертывания в веб-приложении, используя JSF или тег HTML . Как я могу это достичь?

По существу, он должен быть доступен с помощью общедоступного URL-адреса. Таким образом, должен в конечном счете ссылаться на http:// URI, а не на file:// URI file:// URI. В конечном счете, источник HTML выполняется на машине конечного пользователя, и изображения загружаются отдельно веб-браузером во время parsingа источника HTML. Когда веб-браузер обнаруживает file:// URI, такой как C:\path\to\image.png , он будет выглядеть в собственной локальной файловой системе конечного пользователя для изображения вместо веб-сервера. Очевидно, что это не сработает, если веб-браузер работает на физически другой машине, чем на веб-сервере.

Существует несколько способов добиться этого:

  1. Если у вас есть полный контроль над папкой с изображениями, просто отпустите папку со всеми изображениями, например /images непосредственно в папке развертывания servletcontainer, например, папку /webapps в случае папки Tomcat и /domains/domain1/applications в случае GlassFish , Никакой дополнительной конфигурации не требуется.


  2. Или добавьте новый webapp-контекст на сервер, который указывает на абсолютное расположение файловой системы диска в папке с этими изображениями. Как это сделать, зависит от используемого контейнера. В приведенных ниже примерах предполагается, что изображения расположены в /path/to/images и вы хотите получить к ним доступ через http: //…/images .

    В случае Tomcat добавьте следующую новую запись в /conf/server.xml от Tomcat внутри :

      

    В случае GlassFish добавьте следующую запись в /WEB-INF/glassfish-web.xml :

      

    В случае WildFly добавьте следующую запись внутри /standalone/configuration/standalone.xml

      

    … и далее вниз в записи той же самой как указано выше :

      

  3. Или создайте Servlet который передает изображение с диска на ответ:

     @WebServlet("/images/*") public class ImageServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getPathInfo().substring(1); File file = new File("/path/to/images", filename); response.setHeader("Content-Type", getServletContext().getMimeType(filename)); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "inline; filename=\"" + filename + "\""); Files.copy(file.toPath(), response.getOutputStream()); } } 

    Если вы используете OmniFaces, то FileServlet может быть полезен, так как он также учитывает запросы главы, кеширования и диапазона.


  4. Или используйте OmniFaces который поддерживает свойство bean, возвращающее byte[] или InputStream :

     public InputStream getImage(String filename) { return new FileInputStream(new File("/path/to/images", filename)); } 

  5. Или используйте PrimeFaces который поддерживает метод bean, возвращающий Stream StreamContent, специфичный для StreamedContent .

     public StreamedContent getImage() throws IOException { FacesContext context = FacesContext.getCurrentInstance(); if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL. return new DefaultStreamedContent(); } else { // So, browser is requesting the image. Return a real StreamedContent with the image bytes. String filename = context.getExternalContext().getRequestParameterMap().get("filename"); return new DefaultStreamedContent(new FileInputStream(new File("/path/to/images", filename))); } } 

Для первого способа и подходы Tomcat и WildFly во втором случае изображения будут доступны по адресу http://example.comhttps://stackoverflow.com/images/filename.ext и, следовательно, доступны в виде простого HTML следующим образом

  

Для подхода GlassFish вторым способом и третьим способом изображения будут доступны по http://example.com/contexthttps://stackoverflow.com/images/filename.ext и, таким образом, могут быть указаны в обычном HTML следующим образом

  

или в JSF следующим образом (контекстный путь автоматически добавляется)

  

Для подхода OmniFaces в четвертом виде ссылайтесь на него следующим образом

  

Для подхода PrimeFaces пятым способом укажите его следующим образом:

    

Смотрите также:

  • Рекомендуемый способ сохранения загруженных файлов в приложении сервлета
  • Самый простой способ обслуживания статических данных вне сервера приложений в веб-приложении Java
  • Абстрактный шаблон для статического сервлета ресурсов (поддержка HTTP-кэширования)
  • Показать изображение в виде байта [] из базы данных как графическое изображение на странице JSF
  • Отображение динамического изображения из базы данных с помощью p: graphicImage и StreamedContent

Чтобы добиться того, что вам нужно, используя tags или , вам нужно создать псевдоним Tomcat v7, чтобы сопоставить внешний путь с контекстом вашего веб-приложения.

Для этого вам нужно будет указать контекст вашего веб-приложения . Самым простым было бы определить файл META-INF / context.xml со следующим содержимым:

   

Затем после перезапуска сервера Tomcat вы можете получить доступ к своим файлам изображений с помощью тегов > или следующим образом:

  

или

  

* Обратите внимание, что путь для контекста необходим для тега, но не для


Еще один возможный подход, если вы не хотите, чтобы изображения были доступны с помощью метода HTTP GET, может заключаться в использовании тега Primefaces (используя tags commandLink или commandButton - метод HTTP POST ).

В вашем Facelet:

      

В вашей фасоли:

 @ManagedBean @ApplicationScope public class FileDownloader { public StreamedContent getStream(String absPath) throws Exception { FileInputStream fis = new FileInputStream(absPath); BufferedInputStream bis = new BufferedInputStream(fis); StreamedContent content = new DefaultStreamedContent(bis); return content; } } } 

В PrimeFaces вы можете реализовать свой компонент таким образом:

 private StreamedContent image; public void setImage(StreamedContent image) { this.image = image; } public StreamedContent getImage() throws Exception { return image; } public void prepImage() throws Exception { File file = new File("/path/to/your/image.png"); InputStream input = new FileInputStream(file); ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); setImage(new DefaultStreamedContent(input,externalContext.getMimeType(file.getName()), file.getName())); } 

В вашем Facelet:

    

Я предлагаю установить атрибут cache = “false” в компоненте graphicImage.

В JSP

 "/> 

Пакеты – com.sun.jersey.core.util.Base64 , java.nio.file.Paths и java.nio.file.Files .

  • Исключения из памяти в System.Drawing.Image.FromFile ()
  • Кадрирование изображений WPF
  • Как вы устанавливаетеLayoutParams () для ImageView?
  • как добавить фоновое изображение в действие?
  • Как я могу создать эффект щелчка изображения, как кнопка на Android?
  • Как загрузить ImageView по URL в Android?
  • Как получить фактическую ширину и высоту изображения с помощью jQuery?
  • Java: rotation изображений
  • Проблемы с перезаписью (повторным сохранением) изображения, когда он был установлен как источник изображения
  • Можно ли настроить образ профиля пользователя с помощью API Facebook?
  • Android, как применить маску к ImageView?
  • Interesting Posts

    Каков рекомендуемый подход к восстановлению истории миграции с использованием Django South?

    Удаление пустых строк в Notepad ++

    String.Replace () vs. StringBuilder.Replace ()

    Эффективный способ удаления всей строки, если ячейка не содержит «@»

    Маршрутизация и токен аутентификации AngularJS с webapi

    Reactjs – настройка состояния из реквизита с использованием setState в дочернем компоненте

    «Операция недействительна из-за ошибки текущего состояния объекта во время обратной передачи

    Как преобразовать переменную массива bash в строку, ограниченную символами новой строки?

    Импорт пользовательского classа в Java

    База данных установки (SQLite) для Unity

    Как реализовать аутентифицированные маршруты в React Router 4?

    Как инициализатор экземпляра отличается от конструктора?

    Автоматизация экспорта календаря из Outlook в Google

    Каковы некоторые хорошие обучающие игры для iPhone 3D / 2D OpenGL ES?

    Как установить бета-версию Google Chrome для всех пользователей?

    Давайте будем гением компьютера.