问题描述
我无法显示数据库中的图像,它们存储为 bytea ,我正在这样映射它们:
I can´t display images from my database, they are stored as bytea and I am mapping them like this:
@Entity
@Table(name = "photograph", schema = "public")
public class Photograph{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "photograph_id", unique = true, nullable = false)
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "diagnostic_id", nullable = false, insertable = false, updatable = false)
private Diagnostic diagnostic;
@Column(name = "photo", nullable = false)
private byte[] photo;
@Column(name = "photograph_description", nullable = false, length = 100)
private String photographDescription;
@Column(name = "photograph_content_type")
private String photographContentType;
//Getters and Setters...
}
我可以毫无问题地将所有图像存储在数据库中.问题是当我想在 p:dataTable 中显示它们时,如下所示:
I can store all the images in the database with no problem. The problem is when I want to show them in a p:dataTable like this:
<p:dataTable id="dataTableLoadedPhotos"
value="#{imageController.photographListUpdate}" var="image">
<p:column headerText="Fotografías cargadas" width="110">
<o:graphicImage value="#{imageStreamer.getById(image.photographId)}"
alt="#{msgs['label.diagnostic.photograph.notFound']}" />
</p:column>
</p:dataTable>
我正在使用基于 The BalusC代码的流光 :ImageServlet ,我尝试使用 o:graphicImage 失败,结果是mi代码中缺少:
I am using a streamer based on The BalusC Code: ImageServlet and I tried to use o:graphicImage with no success, something is missing in mi code:
@ManagedBean
@ApplicationScoped
public class ImageStreamer {
@EJB
private PhotographService photographService;
public byte[] getById(Long id) {
try {
return photographService.getContent(id);
} catch (ServiceException e) {
FacesMessage mensaje = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"Error al buscar la fotografía ", e.getMessage());
FacesContext.getCurrentInstance().addMessage(null, mensaje);
}
return null;
}
}
我还有一个带有@RequestScoped的托管bean:
I also have a managed bean with @RequestScoped:
@ManagedBean
@RequestScoped
public class ImageController {
@EJB
private PhotographService photographService;
@ManagedProperty(value = "#{diagnosticDataManager}")
private DiagnosticDataManager diagnosticDataManager;
private List<Photograph> photographListUpdate = new ArrayList<Photograph>();
private Photograph selectedPhoto;
/**
*
*/
public ImageController() {
diagnosticDataManager = new DiagnosticDataManager();
}
@PostConstruct
public void init() {
if (diagnosticDataManager.getDiagnostic().getDiagnosticId() != null)
photographListUpdate = photographService
.findPhotosByDiagnostic(diagnosticDataManager
.getDiagnostic());
for (Photograph photograph : photographListUpdate) {
byte[] imageContent = org.apache.commons.codec.binary.Base64
.decodeBase64(photograph.getPhoto());
ExternalContext ec = FacesContext.getCurrentInstance()
.getExternalContext();
ec.getSessionMap()
.put(photograph.getId().toString(),
imageContent);
}
}
// Getters and setters....
}
我在p:dataTable中仅看到两行对应于没有图像的预加载图像,只显示了o:graphicImage的"alt"属性消息
I only see two rows in p:dataTable corresponding to the images preloaded with no image, just the message of "alt" attribute of the o:graphicImage is shown
使用萤火虫,我只会在每一行上看到它:
Using firebug I only see this on each row:
<img alt="Imagen no encontrada" src="/patientdiagnostics/javax.faces.resource/ImageStreamer_getById.xhtml?ln=omnifaces.graphic&v=0&p=7">
我还尝试了类似的操作< p:graphicImage>中的图像在< ui:repeat>
推荐答案
因此,这实际上是不正确的.这些图像似乎是空的或仅填充了零.
This was thus actually not true. Those images appear to be empty or filled with only zeroes.
如何从<p:fileUpload>
抓取上传的文件内容,请转到以下答案:
How to grab the uploaded file content from a <p:fileUpload>
, head to the following answers:
- How to use PrimeFaces p:fileUpload? Listener method is never invoked or UploadedFile is null
- How to insert uploaded image from p:fileUpload as BLOB in MySQL?
无关与具体问题无关,因为您要添加到流媒体的catch块中的面对消息不会出现在任何地方,因为图像请求不代表JSF页面.您最好只记录/发送邮件.
Unrelated to the concrete problem, that faces message which you're trying to add in the catch block of the streamer won't appear anywhere as the image request doesn't represent a JSF page. You'd better just log/mail it.
这篇关于当我使用o:graphicImage时,图像不显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!