2015-05-04 2 views
0

я не могу отобразить изображения из моей базы данных, они сохраняются как BYTEA и я их отображения, как это:Когда я использую O: graphicImage, изображение не отображается

@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... 
} 

можно хранить все изображения в базе данных без проблем. Проблема заключается в том, когда я хочу, чтобы показать их в р: DataTable так:

<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 Code: ImageServlet и я пытался использовать o:graphicImage без успеха, то не хватает в ми код:

@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:

@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.... 
} 

я видеть только две строки в р: DataTable, соответствующие изображения с предустановленными без изображения, просто сообщение «ALT» атрибут O: graphicImage показана

Используя Firebug я только увидеть это на каждую строке:

<img alt="Imagen no encontrada" src="/patientdiagnostics/javax.faces.resource/ImageStreamer_getById.xhtml?ln=omnifaces.graphic&v=0&p=7"> 

я пытался что-то похожее на Display database blob images in <p:graphicImage> inside <ui:repeat>

+0

Я использую ap: fileUpload для сохранения изображения в БД, метод init() имеет 'byte [] imageContent = org.apache.commons.codec.binary.Base64 .decodeBase64 (photograph.getPhoto());' потому что я видел в другом questión, я не уверен, что изображения хранятся в байтах с base64-кодированием, я просто загружаю jpg-образ в db, поэтому я должен был декодировать это из-за размера изображения, что может быть правильно? –

+0

Я удалил все файлы base64, я все еще вижу 'Imagen no encontrada' и в сети браузера я вижу 'http: // localhost: 8080/patientdiagnostics/javax.faces.resource/ImageStreamer_getById.xhtml? Ln = omnifaces.graphic & v = 0 & p = 7' , он имеет столбец, который говорит 200 OK (BFCache).Если вам нужно увидеть метод, который я использую для сохранения изображений в моем db, сообщите мне –

+0

Firefox и JPG –

ответ

0

можно хранить все изображения в базе данных без проблем.

Это было фактически не так. Эти изображения кажутся пустыми или заполнены только нулями.

Как захватить загруженное содержимое файла из <p:fileUpload>, головы на следующие ответы:


Unrelated к конкретной проблеме, что лицо, которое вы пытаетесь добавить в блок catch стримера не будет отображаться нигде, поскольку запрос изображения не представляет собой страницу JSF. Вам лучше просто зарегистрировать/отправить его по почте.

Смежные вопросы