webentwicklung-frage-antwort-db.com.de

Wie schreibe ich eine Datei in den Ressourcen-/Bilderordner der App?

Ich möchte ein Bild hochladen und auf dem Server speichern und es später mit h: graphicImage anzeigen? Ich möchte es in "Ressourcen/Bilder" der App speichern. Ich verwende glassfish 4. Im Moment geht die Datei zu "domain1\generated\jsp\FileUpload". Vielen Dank

Meine Form

<h:form id="form" enctype="multipart/form-data">
        <h:messages/>
        <h:panelGrid columns="2">
            <h:outputText value="File:"/>
            <h:inputFile id="file" value="#{uploadPage.uploadedFile}"/>
        </h:panelGrid>
        <br/><br/>
        <h:commandButton value="Upload File" action="#{uploadPage.uploadFile}"/>
</h:form>

Meine Bohne

@Named
@ViewScoped
public class UploadPage {       
    private Part uploadedFile; 

    public void uploadFile(){
       File file = File.createTempFile("somefilename-", ".jpg", new File("C:\\var\\webapp\\images"));
    uploadedFile.write(file.getAbsolutePath());

    }
}
10
Pavel

Ich möchte es in "Ressourcen/Bilder" der App speichern

Nein, bitte nicht. Der WAR-Bereitstellungsspeicherplatz ist nicht als permanenter Dateispeicherort vorgesehen. Alle diese hochgeladenen Dateien gehen verloren, wenn Sie die Webanwendung erneut bereitstellen, und zwar aus dem einfachen Grund, dass sie nicht in der ursprünglichen WAR-Datei enthalten sind. Siehe für eine ausführliche Erklärung auch diese Antwort auf eine sehr eng verwandte Frage: Hochgeladenes Bild nur nach Aktualisierung der Seite verfügbar .


Im Moment geht die Datei zu "domain1\generated\jsp\FileUpload".

Weil Sie in Part#write() einen relativen Pfad angegeben haben. Es wird relativ zum aktuellen Arbeitsverzeichnis, über das Sie keine Kontrolle haben. Siehe für eine ausführliche Erklärung auch diese Antwort: getResourceAsStream () vs FileInputStream . Sie müssen einen absoluten Pfad angeben, dh den Pfad mit / beginnen.


Wenn Sie Glassfish verwenden, ist die Antwort in Hochgeladenes Bild erst nach dem Aktualisieren der Seite verfügbar sollte dies auch für Sie tun. In einer Nussschale:

  1. Erstellen Sie einen /var/webapp/images Ordner. Beachten Sie, dass dieser Pfad nur ein Beispiel ist und Ihrer Wahl frei steht. Beachten Sie auch, dass dieser Pfad C:\ entspricht, wenn Sie Windows mit einem C:\var\webapp\images-Datenträger verwenden.

  2. Speichern Sie die hochgeladene Datei dort.

    Path file = Files.createTempFile(Paths.get("/var/webapp/images"), "somefilename-", ".jpg", );
    
    try (InputStream input = uploadedFile.getInputStream()) {
        Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
    }
    
    imageFileName = file.getFileName().toString();
    // ...
    

    (Hinweis: Files#createTempFile() wird verwendet, um einen eindeutigen Dateinamen automatisch zu generieren. Andernfalls wird eine zuvor hochgeladene Datei überschrieben, wenn die neu hochgeladene Datei (zufällig) genau denselben Dateinamen hat.)

  3. Weisen Sie GlassFish an, einen virtuellen Host auf /var/webapp/images zu registrieren, damit alle Dateien auf http://example.com/images verfügbar sind, indem Sie den folgenden Eintrag zu /WEB-INF/glassfish-web.xml der Webanwendung hinzufügen:

    <property name="alternatedocroot_1" value="from=/images/* dir=/var/webapp" />
    

    (Hinweis: alternatedocroot_1 muss genau so sein, nicht ändern, wenn Sie mehrere haben, alternatedocroot_2 benennen usw.; beachten Sie auch, dass der /images-Teil in der Tat nicht im dir-Attribut enthalten sein sollte, dies ist kein Tippfehler)

  4. Jetzt können Sie es wie folgt anzeigen:

    <h:graphicImage value="/images/#{bean.imageFileName}" />
    

    (Anmerkung: value Attribut verwenden, nicht name Attribut)

23
BalusC

Konnte es nicht mit Path#write in glassfish zum Laufen bringen, also habe ich Path#getInputStream wie folgt verwendet:

public void upload(){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            String filename = getFilename(uploadedFile);
            File file = new File("/var/webapp/images/"+filename);
            bis = new BufferedInputStream(uploadedFile.getInputStream());
            FileOutputStream fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            int x;
            while((x = bis.read())!= -1){
                bos.write(x);
            }
        } catch (IOException ex) {
            Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally{
            try {
                bos.flush();
                bos.close();
                bis.close();
            } catch (IOException ex) {
                Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

private static String getFilename(Part part) {
        for (String cd : part.getHeader("content-disposition").split(";")) {
            if (cd.trim().startsWith("filename")) {
                String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
                return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
            }
        }
        return null;
    }
1
Dapope