Jak przesłać plik za pomocą JSF 2.2? Gdzie jest zapisany plik?
Chciałbym móc wgrywać pliki do mojej aplikacji internetowej JSF2.2, więc zacząłem używać nowego komponentu <h:inputFile>
.
Moje jedyne pytanie brzmi, jak Mogę określić lokalizację, gdzie pliki będą zapisywane na serwerze? Chciałbym je zdobyć jako java.io.File
instancje. To musi być zaimplementowane w fasoli, ale nie do końca rozumiem jak.
1 answers
JSF nie zapisze pliku w żadnej z predefiniowanych lokalizacji. Będzie to w zasadzie po prostu zaoferować przesłany plik w smaku javax.servlet.http.Part
instancja, która znajduje się za kulisami, tymczasowo przechowywana w pamięci serwera i / lub tymczasowej lokalizacji na dysku, o którą nie powinieneś się martwić.
Aby zapisać go w wybranym miejscu, musisz uzyskać zawartość przez Part#getInputStream()
a następnie skopiuj to do Path
reprezentuję miejsce. Możesz to zrobić w metoda (ajax) action (listener) w zwykły sposób. Oto przykład, który robi to ze słuchaczem ajax podczas zdarzenia HTML DOM change
:
<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.file}">
<f:ajax listener="#{bean.save}" />
</h:inputFile>
</h:form>
private Part file; // +getter+setter
public void save() {
try (InputStream input = file.getInputStream()) {
Files.copy(input, new File(uploads, filename).toPath());
}
catch (IOException e) {
// Show faces message?
}
}
Folder uploads
i filename
jest w pełni pod twoją kontrolą. Np. "/path/to/uploads"
i Part#getSubmittedFileName()
odpowiednio. Pamiętaj, że każdy istniejący plik zostanie nadpisany, możesz użyć File#createTempFile()
aby automatycznie wygenerować nazwę pliku.
Do nie użyj Part#write()
jak sugerują niektórzy prople. Będzie zasadniczo Zmień nazwę pliku w miejscu tymczasowego przechowywania określonym przez @MultipartConfig(location)
. Aby zapisać przesłany plik w folderze deploy, należy użyć , a nie ExternalContext#getRealPath()
. Plik zostanie utracony, gdy wojna zostanie przesunięta z prostego powodu, że plik nie jest zawarty w pierwotnej wojnie. Zawsze zapisuj go na ścieżce bezwzględnej poza folderem wdrożenia.
Aby zobaczyć demo na żywo, sprawdź ostatnią pozycję <o:graphicImage>
demo na OmniFaces showcase .
Zobacz także:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:49