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());
}
}
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:
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.
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.)
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)
Jetzt können Sie es wie folgt anzeigen:
<h:graphicImage value="/images/#{bean.imageFileName}" />
(Anmerkung: value
Attribut verwenden, nicht name
Attribut)
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;
}