Frage

Ich bin derzeit die Suche in einem gewissen Hochladen von Dateien mit Hilfe von Java Server Faces. Ich habe dieser großartige Einführung gefunden es Richfaces verwenden. Allerdings habe ich einige Probleme hier den Prozess zu verstehen.

Zuerst wählt der Benutzer eine Datei und wenn die sofortigen Hochladen auf true gesetzt wird die Datei verarbeitet wird, mit Ajax, so weit so gut. Wenn es jedoch mit dem nächsten Schritt kommt, die im Anschluss an den Zuhörer auf der Bean-Seite verwirrt mich:

public void listener(UploadEvent event) throws Exception{
    UploadItem item = event.getUploadItem();

    File f = item.getFile();

    System.out.println(f.getAbsolutePath());
}

Der absolute Pfad ist in ein temporären Verzeichnis auf meinem Computer, sicher, ich verstehe das, aber wie würden Sie die Datei auf die webbapplication zur Verfügung stellen? Meine Anwendung wird als WAR-Datei bereitgestellt. Ist es möglich, an der IST hochladen? Klingt vielleicht dumm oder so, aber es könnte tatsächlich sehr nützlich sein.

Ich bin mir voll bewusst, dass ich die Datei, um sie an einen neuen Speicherort kopieren umbenennen können, aber ist, dass der Weg zu gehen?

War es hilfreich?

Lösung

Schreiben Dinge zu Ihrem WAR-Verzeichnis (das WAR-Annahme wird auch als Verzeichnis explodiert) ist, in der Regel eine schlechte Idee (aus den gleichen Gründen, dass Ihre Daten in Ihrem Anwendungsverzeichnis zu speichern ist in der Regel eine schlechte Idee).

Sie würden wahrscheinlich wollen, dass es in einem persistenten Speicher, um am Ende, in der Regel eine Datenbank. Genau wie Sie, dass verwalten ist bis zu Ihnen -., Ob Sie das Dateisystem verwenden und speichern eine Referenz in der Datenbank oder speichern Sie eine BLOB in der Datenbank direkt und ob Sie verwenden JDBC oder JPA oder Hibernate, etc.

Die Liste der hochgeladenen Dateien dann aus der Datenbank gelesen werden, um die Platte durch Auffrischen, die sie so etwas wie <a4j:support event="onuploadcomplete" reRender="info" /> mit enthalten ist.

Ein Datei-Download-Servlet (wenn Richfaces nicht vorhanden) ist ziemlich einfach zu schreiben.

Andere Tipps

Nicht sicher, wie viel Hilfe das ist (und wahrscheinlich viel zu spät!), Aber das ist der Code, den ich auf der Server-Seite verwenden, das entspricht Ihrer Zuhörer.

public String uploadFile(UploadEvent event) {
    UploadItem item = event.getUploadItem();

    String name = "unnamed_attachment";
    byte[] data = item.getData();

    try {
        name = FilenameUtils.getName(item.getFileName());
        data = FileUtils.readFileToByteArray(item.getFile());
        logger.info("data.length = " + data.length);
        UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant)

        details.setBytes(data);
        details.setResume(true);
        // Save to database here 

    } catch (Exception e) {
        FaceletsUtil.addSystemErrorMessage();
        logger.error(e, e);
    }
    return null;
}

Die große Frage verbleibende Sie sagen, „wie würden Sie die Datei auf die webbapplication zur Verfügung stellen?“. Der Byte-Arrays ist sofort verfügbar. Wenn Sie die Datei erneut herunterladen möchten, können Sie es als Verbindung zu einem Verfahren in einer JSF-Session / Ansicht Bean zur Verfügung stellen kann, wie:

<h:commandButton action="#{Manager.downloadFile}" value="Download report">                                </h:commandButton>

public void downloadFile() {
    final HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

    response.setHeader("Content-Disposition", "attachment;filename=radar-report" + new Date() + ".pdf"); // or whatever type you're sending back
    try {
        response.getOutputStream().write(uploadDetails.getBytes()); // from the UploadDetails bean
        response.setContentLength(uploadDetails.getBytes().length);
        response.getOutputStream().flush();
        response.getOutputStream().close();
    } catch (IOException e) {
        logger.error(e, e);  
    }
    FacesContext.getCurrentInstance().responseComplete();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top