获取返回 StreamedContent 的 的具体 URL

2023-11-22

为了使用灯箱,我需要一个指向由以下命令生成的图像的链接<p:graphicImage>.

最终,HTML 应该如下所示:

<a href="image.jpg" data-lightbox="bilder">
  <img src="image.jpg" />
</a>

这是我到目前为止的 JSF 尝试:

<h:outputLink data-lightbox="bilder" value="???">
  <p:graphicImage value="#{imageStreamer.image}">
    <f:param name="imageId" value="#{gameReader.game.cover.id}"/>
  </p:graphicImage>
</h:outputLink>

如何获取具体的URL<p:graphicImage>返回StreamedContent这样我就可以在我的链接中使用它?


这有一个解决方案 - 这里使用 servlet 是一个可以在任何 jsf 应用程序中工作的 servlet

package com.dossier.web.handlers;

//~--- non-JDK imports --------------------------------------------------------



import com.dossier.backend.services.mongo.FileService;
import com.mongodb.gridfs.GridFSDBFile;

//~--- JDK imports ------------------------------------------------------------

import java.io.*;

import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;

/**
 *
 * @author Armen Arzumanyan
 */
@WebServlet(urlPatterns = { "/PreviewImage" })
public class PreviewImage extends HttpServlet implements SingleThreadModel {
    private static final long serialVersionUID = -6624464650990859671L;
    private FileService       fileAction       = new FileService();

    @Override
    public void init() throws ServletException {
        super.init();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPreviewImage(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {}

    private void doPreviewImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
        FacesContext context   = FacesContext.getCurrentInstance();
        String       fileIdStr = request.getParameter("fileId");
        String       widthStr  = request.getParameter("w");
        GridFSDBFile file      = null;
        int          width     = 0;

        if ((widthStr != null) && (widthStr.length() > 0)) {
            try {
                width = Integer.parseInt(widthStr);
            } catch (NumberFormatException e) {}
        }

        if (fileIdStr != null) {
            if (fileAction != null) {
                file = fileAction.getFile(fileIdStr.trim());
            }

            if (file != null) {
                byte[] content = IOUtils.toByteArray(file.getInputStream());

                if (content != null) {
                    String mimeType = file.getContentType();

                    response.addHeader("Pragma", "cache");
                    response.addHeader("Cache-Control", "max-age=3600, must-revalidate");
                    response.addDateHeader("Expires", System.currentTimeMillis() + 1000 * 3600 * 10);
                    response.setContentType(mimeType);

                    try {
                        if (((mimeType != null)
                                && (mimeType.equalsIgnoreCase("image/gif") || mimeType.equalsIgnoreCase("image/x-png")
                                    || mimeType.equalsIgnoreCase("image/png") || mimeType.equalsIgnoreCase("image/jpg")
                                    || mimeType.equalsIgnoreCase("image/jpeg"))) || (width == 0)) {
                            response.getOutputStream().write(content);
                        } else {

//                          ByteArrayInputStream bi = new ByteArrayInputStream(content);
//                          InputStream thumbStream = scaleImageJPG(bi, width);
//                          byte[] thumbContent = new byte[thumbStream.available()];
//                          thumbStream.read(thumbContent);
                            response.getOutputStream().write(content);
                        }
                    } catch (IOException e) {

                        // log.error("file content send error");
                        e.printStackTrace();
                    } catch (Exception e) {

                        // log.error("file exception: " + e);
                        e.printStackTrace();
                    } finally {
                        content = null;
                        file    = null;
                    }

                    return;
                }
            } else {

                // TODO add page not found
                response.addHeader("Pragma", "no-cache");
                response.addDateHeader("Expires", System.currentTimeMillis() - 1000 * 3600);

                try {
                    response.getWriter().println("file object is null");
                } catch (Exception e) {}

                return;
            }
        }

        // TODO add page not found
        response.addHeader("Pragma", "no-cache");
        response.addDateHeader("Expires", System.currentTimeMillis() - 1000 * 3600);

        try {
            response.getWriter().println("file id is not set");
        } catch (Exception e) {}

        // log.debug("file ID parameter is not set or file is not found");
        return;
    }

    // </editor-fold>
}


//~ Formatted by Jindent --- http://www.jindent.com

这是一个网页代码

<h:graphicImage id="primage" styleClass="img-rounded img-responsive"
                                                                url="/PreviewImage?w=250&amp;fileId=#{updatePersonBean.person.imageId}"
                                                                width="250" rendered="#{updatePersonBean.person.imageId != null}"/>                                              
                                                <h:graphicImage id="primagenew" styleClass="img-rounded img-responsive"
                                                                url="/resources/img/userpic_simple.gif"
                                                                width="250" rendered="#{updatePersonBean.person.imageId == null}"/>

Enjoy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取返回 StreamedContent 的 的具体 URL 的相关文章

  • php:SEO 友好的 url

    我正在开发一个新项目 我想为这个网站创建 SEO 友好的 URL 例如 mysite com first content mysite com second content URL 必须是动态的 这意味着 URL 必须与内容标题相关 我怎样
  • 为什么下载 youtube 文件 ID 不起作用?

    我找到了从 youtube 网站获取电影 ID 的代码 如果 ID 有连字符 则脚本运行良好 natomast 则脚本不会从 url 获取 ID 我对正则表达式很弱 但仍然尝试转换表达式 但我无法处理它 你能指导我或告诉我我犯了什么错误吗
  • viewExpiredException JSF [重复]

    这个问题在这里已经有答案了 为了处理 JSF 中的 viewExpiredException 我编写了代码
  • 将默认消息“验证错误:需要值”更改为“需要值”

    我可以修改这个默认值吗required true 验证消息仅显示 需要值 formId inputId 验证错误 值是必需的 Either使用输入组件的requiredMessage属性
  • JSF 和库的不明确性

    在花了一些时间使用 servlet 和 JSP 之后 现在我正在尝试了解一些有关 JSF 的知识 我已经学习了基础知识 做了几个简单的例子 对 工作流程 有了基本的了解 但我仍然无法理解 javax faces webapp FacesSe
  • 如何用 JSON 表示数据库中的图像

    我需要基于数据库中的 blob 创建 JSON 为了获取 blob 图像 我使用下面的代码并在 json 数组中显示之后 Statement s connection createStatement ResultSet r s execut
  • h:message 为空时的默认输出

    我正在寻找一种在 JSF 中实现以下切换的方法 div if empty div
  • 如何使用jsf组件显示丰富的内容?

    我使用 rich 编辑器组件输入丰富的内容 并将其保存在数据库中 当我尝试在 outputText 字段中显示它时 丰富的标签不会被解释并显示为简单文本 所以我的问题是 如何让 jsf 组件 或 Richfaces 解释这些丰富的内容并正确
  • Primefaces、JavaScript 和 JSF 不能很好地协同工作,或者我做错了什么

    这是非常简单的事情
  • ui:define with generated="false" 属性仍然呈现

  • 如何在@FacesConverter中注入@EJB、@PersistenceContext、@Inject、@Autowired等?

    我怎样才能注入像这样的依赖项 EJB PersistenceContext Inject AutoWired等在一个 FacesConverter 在我的具体情况下 我需要通过注入 EJB EJB FacesConverter public
  • 是否可以在带有 标记的链接上使用空 href

    我将基本标签设置为这样 然后我想创建一个链接http mnapoli github com PHP DI http mnapoli github com PHP DI 在相对路径中 I tried a href link a 它在 Chro
  • 删除特定数据表上的所有边框

    我需要使用 PrimeFaces 隐藏一个数据表的所有边框 而不是全部 我尝试了很多事情 但没有人奏效 有谁知道该怎么做 我已将以下样式 单独 应用于ui datatable class border hidden important bo
  • PrimeFaces 对话框参考父级

    我有一个 xhtml 页面 显示带有条目的数据表 我还有一个用于插入新条目的按钮 该按钮显示一个包含表单的对话框 插入表格用作
  • JSF 2 和发布/重定向/获取?

    如果我错了 请纠正我 但我认为我所有的非 AJAX 提交都应该使用 Post Redirect Get PRG 方式 因为 GET 应该用于刷新 查询数据 就我而言 我能想到的应用程序页面实际上只对数据进行更新 然后刷新页面 所以我认为 P
  • Django 检索 GET 列表

    我是 Django 新手 我有一个 URL 列表 例如 example com item test item for test url 我知道如何在视图中检索该值 a request GET getlist item 我的问题是 如何在模板
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • API 端点的 Django 子域配置

    我已经建立了一个 Django 项目 它使用django rest framework提供一些 ReST 功能 网站和其他功能都运行良好 然而有一个小问题 我需要我的 API 端点指向一个不同的子域 例如 当用户访问该网站时 他 她可以根据
  • 如何在 Python 中从 HTML 页面中提取 URL [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须用Python 编写一个网络爬
  • 使用 jQuery 修改 HTML 表格的结构

    我有一个元素列表 X在以下示例中 显示在 HTML 表格的行或列中 从 HTML 代码的角度来看 我有 水平显示 table tr td A td td B td td C td tr table 或 垂直显示 table tr td A

随机推荐

  • 无法启动 iOS 8 模拟器

    我刚刚从 Mac App Store 将 Xcode 更新到 6 0 1 我的操作系统版本是 OS X 10 9 5 问题是 iOS 8 模拟器无法加载 但 iOS 7 模拟器工作正常 每次我尝试启动 iOS 8 模拟器设备时 都会收到一条
  • add_lvalue_reference_t 和 T& 之间的区别

    假设你有一个模板参数T 两者有什么区别 add cv t
  • OpenCV (Emgu.CV)——使用 alpha 合成图像

    我正在使用 Emgu CV 执行一些基本的图像处理和合成 我的图像加载为Image
  • 获取 foreach 循环中的下一个元素

    我有一个 foreach 循环 我想查看循环中是否有下一个元素 以便我可以将当 前元素与下一个元素进行比较 我怎样才能做到这一点 我已阅读有关当前和下一个功能的信息 但我不知道如何使用它们 一种独特的方法是反转数组并then环形 这也适用于
  • TRestClient/TRestRequest 错误地解码 gzip 响应

    我尝试读取 REST API 它是 gzip 编码的 确切地说 我尝试阅读 StackExchange API 我已经找到问题了自动解码 TRESTResponse 中的 GZIP 但由于某种原因 这个答案并不能解决我的问题 测试设置 在X
  • 即使已处理异常,在 VS2010 调试器中也会出现未处理的异常

    我在使用 VS2010 时遇到一个问题 调试器因未处理的异常而停止 不过 异常肯定是得到处理的 事实上 如果我将代码放入 catch 块中 当我按 F5 时就会命中它 在 调试 gt 异常 中 我肯定会这样做not选中 抛出 复选框 因此
  • 挥发性与原子性[重复]

    这个问题在这里已经有答案了 我在下面的某处读到 Java volatile 关键字并不意味着原子 这是它的常见误解 声明 volatile 后 操作将是原子的 以使 您仍然需要使用原子操作来确保独占访问synchronizedJava 中的
  • WCF平台是否独立?

    我只需要知道 WCF 是否像 Webservices 一样与平台无关 Java和Php可以访问WCF中的函数吗 Thanks 是的 当然 WCF 本身只能在 Windows 上运行 但它提供的服务可以从任何其他语言 工具访问 使用 WCF
  • 我可以在基类中重载纯虚方法吗?

    在下面的示例中 我有一个带有纯虚方法 又名 FUN1 和普通方法 又名 FUN2 的抽象类 include
  • 使用返回 impl 特征的泛型函数“借用的值寿命不够长”

    我从这个 Rust 代码中得到一个意外的错误 struct Container lt a gt x a i32 trait Reply impl Reply for i32 fn json
  • For 循环内的 Postgresql 更新

    我对 postgresql 还很陌生 并且在使用 for 循环更新表中的空值列时遇到问题 我正在处理的表格很大 因此为了简洁起见 我将给出一个较小的示例来说明要点 采取下表 id A B C a 1 0 NULL b 1 1 NULL c
  • 如何刷新列表框的数据源

    表单有1个Combobox和1个ListBox 单击 添加 按钮时 我想将组合框中的所选项目添加到列表框中 public partial class MyForm Form List
  • 关闭电脑

    有没有办法使用内置的 Java 方法关闭计算机 创建您自己的函数以通过以下方式执行操作系统命令命令行 举个例子 但正如其他人指出的那样 知道您想要在何处以及为何使用它 public static void main String arg t
  • 如何在 Spring 控制器中检索 FORM/POST 参数?

    我有以下回应 应该来自邮件黑猩猩网络钩子 URL 这是行正文 RAW BODY type usub fired at 2015 07 23 17 3A19 3A34 data 5Baction 5D unsub data 5Breason
  • 禁用 PHPhotoLibrary 中删除请求的确认

    我想做的是将视频保存到 PHPhotoLibrary 然后在应用程序中上传到客户端远程服务器完成时删除它们 基本上 照片库充当临时存储 以添加额外的安全层 以防万一发生任何故障 我已经将我的视频保存在应用程序目录中 Problem 问题是要
  • 使用 Java 从 Github 下载二进制文件

    我正在尝试下载此文件 http github com downloads TheHolyWaffle ChampionHelper ChampionHelper 4 jar 用下面的方法 它似乎不起作用 我收到一个空 损坏的文件 Strin
  • 有没有办法使用curse在同一终端上创建单独的显示和输入?

    我想编写一个命令行程序来生成以下用户界面 A B A 是一个单独的进程 它循环并显示实时事件列表 它会自动刷新 B 是命令提示符 它固定在底部并有命令历史记录 我知道一些命令行 IRC 程序会执行此操作 因此它一定是可能的 如果您能给我一个
  • Stargazer 输出是代码,而不是表格

    我正在尝试使用 RStudio 中的 stargazer 包来生成数据汇总表 由于某种原因 当我使用 html 或 Latex 代码时 我无法查看输出中的表格 但当我输出为文本时 我可以看到它 一个例子 library stargazer
  • 类型错误:google.visualization.DataTable 不是构造函数

    在我的网页上有一个谷歌地图 以及三个图表 当页面加载时 地图很好 但图表要么不加载 要么只有一两个加载 不断收到错误 TypeError google visualization DataTable 不是构造函数 function load
  • 获取返回 StreamedContent 的 的具体 URL

    为了使用灯箱 我需要一个指向由以下命令生成的图像的链接