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.

Author: BalusC, 2014-12-28

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:

 26
Author: BalusC,
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