我将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;
}
答案 0 :(得分:0)
这不是p:graphicImage
的工作方式。您尝试使用字节数组显示图像,而此标记需要图像的URL(或StreamedContent)。
<p:graphicImage value="img/myImg.png" />
现在,您有2个选项(至少)
从字节数组(图像数据)创建图像并存储 它可以通过您的Web应用程序访问它。 value属性仍应包含URL而不是字节数组。
不要将图像存储在数据库中,而是存储图像名称(或 服务器上图像的路径)(例如,您的数据库将只是保持不变 img001.png,img002 png等你知道他们都在里面,比如,img 服务器上的文件夹。然后,您所要做的就是更改图片网址。
<p:graphicImage value=#{imgUrl} />
实际上建议选项2特别适用于大图像,但即使图像不大,此方法也具有不必将图像(字节数组)转换为文件的优点。
在您的HTML中,这将呈现为
<img src="img/img001.png" >