Wie das herunterladen einer Datei in einer Datenbank gespeichert, die mit JSF 2.0
Muss ich das herunterladen einer Datei in einer Datenbank gespeichert. Ich glaube, ich habe richtig die Abfrage und nannte es, ich weiß nur nicht, wie kann ich schließen Sie es an eine Schaltfläche in einer JSF-Seite.
Auch Frage ich mich, muss ich speichern, das Bild in einem Ordner auf dem server vor der übergabe an die JSF-Seite. Wenn ja, Wie kann ich das machen?
Dies ist die Abfrage, die ich verwenden, um die return das byte[] von der db:
@NamedQuery(name = "downloadGarbage", query = "SELECT g.file FROM Garbage g WHERE g.id :idParam")
@Entity
public class Garbage implements Serializable {
@Lob
@Column(nullable = false)
private byte[] file;
....
Hier ist eine einfache EJB, die fordert, dass die Abfrage dann die id:
@Stateless(name = "ejbs/FileDownloaderEJB")
public class FileDownloaderEJB implements IFileDownloaderEJB {
@PersistenceContext
private EntityManager em;
public byte[] downloadGarbage(Long id) {
Query query = em.createNamedQuery("downloadGarbage");
query.setParameter("idParam", id);
Object o = query.getSingleResult();
byte[] tmpArray = (byte[]) o;
return tmpArray;
}
Nun ist dies der Teil, der mich verwirrt, wie kann ich das oben mit der JSF-Seite und managed bean?
@ManagedBean
@RequestScoped
public class DownloadController {
@EJB
private FileDownloaderEJB fileDownloaderEJB;
...
private Garbage garbage;
public void startDownload(Long id) {
fileDownloaderEJB.downloadGarbage(id);
//HOW TO START THE DOWNLOAD?
//Other Get Set Methods...
}
}
Auch wie kann ich den pass, die lange id der managedBean aus der JSF aus einem commandButton? Ist das erlaubt?
<!-- How to pass the value of id from -->
<h:commandButton action="downloadController.startDownload(#{garbage.id})">
Du musst angemeldet sein, um einen Kommentar abzugeben.
Übergabe von Parametern in der EL funktioniert nur, wenn die
web.xml
erklärt wird, wie Servlet 3.0 und der servletcontainer unterstützt es auch (Glassfish 3, JBoss 6, Tomcat 7, etc). Es gibt nur ein syntax-Fehler in Ihrem Versuch, hier der korrekte Weg:Kann man sogar passieren die ganze Objekte zusammen, das ist besser in diesem speziellen Fall.
Dann, die
startDownload()
Methode sollte die Antwort-Header so, dass der webbrowser versteht, was content-type der response-body steht und was zu tun mit ihm, und schließlich schreiben Sie den Inhalt des response-body. Sie können es mit Hilfe vonExternalContext
. Hier ist ein kickoff-Beispiel:Die Letzte Zeile mit
FacesContext#responseComplete()
ist obligatorisch, so dass JSF versteht, dass es so nicht navigieren Sie zum einige anzeigen und damit potenziell malform die Antwort mit einer anderen JSF-Seite danach..doc
es istapplication/msword
und für.docx
es istapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
. Sie könnenServletContext#getMimeType()
wenn Sie möchten, um zu bestimmen, programmgesteuert auf der Basis der Datei-name. Siehe auch stackoverflow.com/questions/2426773/...