如何使用JSF 2.2 <h:inputfile>上传文件?保存的文件在哪里?</h:inputfile>

时间:2014-12-28 14:39:27

标签: jsf file-upload jsf-2.2 multipartform-data

我希望能够在我的JSF2.2 Web应用程序中上传文件,因此我开始使用新的<h:inputFile>组件。

我唯一的问题是,如何指定文件将保存在服务器中的位置?我想把它们当作java.io.File个实例。这必须在支持bean中实现,但我不清楚如何理解。

1 个答案:

答案 0 :(得分:29)

JSF不会将文件保存在任何预定义的位置。它基本上只是为您提供一个javax.servlet.http.Part实例的上传文件,该实例是临时存储在服务器内存和/或临时磁盘存储位置的幕后,您不必担心。

要将其保存到所需位置,您需要按Part#getInputStream()然后copy将内容传送到代表该位置的Path。您可以通过常规方式在(ajax)动作(侦听器)方法中执行此操作。以下是在HTML DOM change事件期间使用ajax侦听器执行此操作的示例:

<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?
    }
}

uploads文件夹和filename完全由您控制。例如。分别为"/path/to/uploads"Part#getSubmittedFileName()。请记住,任何现有文件都将被覆盖,您可能希望使用File#createTempFile()自动生成文件名。

使用Part#write(),因为有些人可能会建议。它基本上会将文件重命名为@MultipartConfig(location)标识的临时存储位置。也可以使用ExternalContext#getRealPath()以将上传的文件保存在deploy文件夹中。重新部署WAR时文件将丢失,原因很简单,原因是文件未包含在原始WAR中。始终将其保存在部署文件夹外的绝对路径上。

要进行实时演示,请检查<o:graphicImage> demo on OmniFaces showcase的最后一项。

另见: