t3s*_*3s0 12 jsf file-upload multipartform-data jsf-2.2
我希望能够在我的JSF2.2 Web应用程序中上传文件,所以我开始使用新<h:inputFile>组件.
我唯一的问题是,如何指定文件将保存在服务器中的位置?我想把它们当成java.io.File实例.这必须在支持bean中实现,但我不清楚如何理解.
Bal*_*usC 32
JSF不会将文件保存在任何预定义的位置.它基本上只是为你提供一个javax.servlet.http.Part实例风格的上传文件,这个实例是临时存储在服务器内存和/或临时磁盘存储位置的幕后,你不必担心.
为了将其保存到所需位置,您需要获取内容Part#getInputStream(),然后将其复制到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>
Run Code Online (Sandbox Code Playgroud)
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?
}
}
Run Code Online (Sandbox Code Playgroud)
该uploads文件夹和filename完全在您的控制之下.例如"/path/to/uploads"和Part#getSubmittedFileName().请记住,任何现有文件都将被覆盖,您可能希望使用它File#createTempFile()来自动生成文件名.
不要像有些人所说的那样使用Part#write().它基本上将文件重命名为临时存储位置,如下所示@MultipartConfig(location).也千万不能使用ExternalContext#getRealPath(),以保存部署文件夹上传的文件.重新部署WAR时文件将丢失,原因很简单,原因是文件未包含在原始WAR中.始终将其保存在deploy文件夹之外的绝对路径上.
要进行现场演示,请查看<o:graphicImage>OmniFaces展示的最后一个演示项目.
| 归档时间: |
|
| 查看次数: |
45772 次 |
| 最近记录: |