来自DB的图像未显示在JSF页面上

时间:2017-04-03 11:07:04

标签: primefaces

我将MySql db与blob中的图像一起使用,并尝试使用PrimeFaces galleria在我的JSF页面上显示它们。在我的页面上,我看到了这个广场,但没有显示图像。我在每张图片的一角看到只有小绿色图标。我只用DB来解决这个问题。如果我的图像在我的文件系统中,一切都会好的。有人能解释为什么我看不到来自DB的图像吗?我写了这段代码:

拱廊:

<p:galleria value="#{imagesView.images}" var="image" panelWidth="500" panelHeight="250" showCaption="true">
        <p:graphicImage value="#{image}" alt="Image Description" title="Title"/>
</p:galleria>

ImagesView:

@ManagedBean
public class ImagesView {

    private List<StreamedContent> images;

    @PostConstruct
    public void init() {
        images = new ArrayList<>();
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        int itemId = Integer.parseInt(request.getParameter("item_id"));
        for (int i = 1; i <= 2; i++) {
            images.add(new GraphicImage().getImageFromDB(i, itemId)); //It's so simple because I need it just for test and that's all
        }
    }

    public List<StreamedContent> getImages() {
        return images;
    }
}

graphicImage的:

@RequestScoped
class GraphicImage implements Serializable {

    StreamedContent getImageFromDB(int id, int itemId) {
        if (FacesContext.getCurrentInstance().getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            return new DefaultStreamedContent();
        } else {
            byte[] image = DBUtils.getImage(id, itemId);
            return new DefaultStreamedContent(new ByteArrayInputStream(image), "image/jpg");
        }
    }
}

DBUtils方法:

public static byte[] getImage(int id, int itemId) {
        byte[] image = null;
        ResultSet resultSet = null;
        try (Connection connection = DataBase.getConnection();
             PreparedStatement statement = connection.prepareStatement("SELECT content FROM images WHERE id = ? AND item_id = ?")) {
            statement.setInt(1, id);
            statement.setInt(2, itemId);
            resultSet = statement.executeQuery();
            resultSet.next();
            image = resultSet.getBytes("content");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return image;
    }

1 个答案:

答案 0 :(得分:0)

这不是p:graphicImage的工作方式。您尝试使用字节数组显示图像,而此标记需要图像的URL(或StreamedContent)。

<p:graphicImage value="img/myImg.png" />

现在,您有2个选项(至少)

  1. 从字节数组(图像数据)创建图像并存储 它可以通过您的Web应用程序访问它。 value属性仍应包含URL而不是字节数组。

  2. 不要将图像存储在数据库中,而是存储图像名称(或     服务器上图像的路径)(例如,您的数据库将只是保持不变     img001.png,img002 png等你知道他们都在里面,比如,img     服务器上的文件夹。然后,您所要做的就是更改图片网址。

    <p:graphicImage value=#{imgUrl} />
    
  3. 实际上建议选项2特别适用于大图像,但即使图像不大,此方法也具有不必将图像(字节数组)转换为文件的优点。

    在您的HTML中,这将呈现为

    <img src="img/img001.png" >