3

我正在使用 JBoss AS7、JSF2、MySQL、EJB 和 JPA 为我的公司创建一个 Java EE 应用程序。

我的 JSF 视图中有一个数据表,其中包含从我的数据库中检索到的数据的几行。在这个数据中,我有一个 BLOB 列,它可以包含任何文件类型,如图像、PDF、文本。

我想在每一行中放置一个链接,以便在新窗口中打开文件。

  1. 如何将 BLOB 类型转换为字节?
  2. 我怎么能做这样的工作?
4

1 回答 1

2

如何将 BLOB 类型转换为字节?

只需在JPA@Lob的属性上添加注释即可。byte[]@Entity


我怎么能做这样的工作?

您需要让 JSF 在表中生成所需的链接,并将实体 ID 作为请求参数。

<h:dataTable value="#{bean.entities}" var="entity">
    <h:column>
        <h:outputLink value="#{request.contextPath}/fileservlet?id=#{entity.id}" target="_blank">#{entity.filename}</h:outputLink>
    <h:column>
</h:dataTable>

然后创建一个简单的文件 servletbyte[] ,它将响应流式传输到doGet()(省略了明显的参数验证和异常处理)。

@WebServlet("/fileservlet")
public class FileServlet extends HttpServlet {

    @EJB
    private EntityService service;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Entity entity = service.find(request.getParameter("id"));
        response.setContentType(entity.getContentType());
        response.setContentLength(entity.getContent().length);
        response.setHeader("Content-Disposition", "inline;filename=\"" + URLEncoder.encode(entity.getFilename(), "UTF-8") + "\"");
        response.getOutputStream().write(entity.getContent());
    }

}

哪里getContent()返回@Lob byte[]财产。

于 2013-02-05T11:26:17.133 回答