在jsf 2.2中上传文件

njs*_*lvr 2 java file-upload jsf-2 tomcat7

使用我公司选择的云存储API并开始使用JSF 2.2.尝试构建一个简单的图像上传Web应用程序,它在我使用Eclipse本地运行时工作.

这是代码:.xhtml页面

<h:form id="form" enctype="multipart/form-data" prependId="false">
Select id Photo: <h:inputFile id="file" value="#{customerEntity.uploadedFile}"/> 
<h:commandButton value="Query Cloud" 
action="#{customerEntity.addActionController}"/> 
</h:form>
Run Code Online (Sandbox Code Playgroud)

customerEntity.java代码:

private Part uploadedFile;
private String fileURI;
Run Code Online (Sandbox Code Playgroud)

在本地计算机上,从Part对象uploadedFile中提取文件名的代码生成正确的文件定位器(例如c:\ pictures\mypix.jpg),以便在我的机器上进行本地访问.

但是,当我加载到运行在云vm中的tomcat 7时,应用程序在"try"块中失败并带有FileNotFound:

 File source = new File(this.fileURI);
 try {
 cloud.upload(new FileInputStream(source), source.length());
Run Code Online (Sandbox Code Playgroud)

我的调试语句显示它使用的是我本地电脑上的文件定位器,它显然不存在于服务器上.我无法弄清楚如何将本地文件数据流式传输到服务器上运行的代码.

作为一个轻微的jsf新手,我确信它是显而易见的,但无法弄明白或通过我见过的其他帖子解决.

任何指导将不胜感激!

Bal*_*usC 5

你犯了一个相当重大的概念错误.您不应对上载文件的客户端指定路径/​​名称感兴趣.相反,您应该对上传文件的内容感兴趣.而且由于两个主要原因:

  1. 当您使用webbrowser时,该文件的路径将完全不存在,该web浏览器不会暴露安全错误,即完整客户端路径包含在上载文件的名称中(即除Internet Explorer之外的任何浏览器).

  2. 使用new File()在客户指定的路径/名称,如果两者(这是被用来发送文件)和(这被用来检索文件)Web服务器的网页浏览器在物理上是同一台机器上运行只会工作,因为他们有那么访问完全相同的本地磁盘文件系统结构.这在现实世界中不会发生.

要将上载文件的内容保存在所需位置,请执行以下操作:

uploadedFile.write("/path/to/uploads/somefilename.ext");
Run Code Online (Sandbox Code Playgroud)

注意:您需要确保该somefilename.ext部件在其文件夹中是唯一的.如有必要,您可以File#createTempFile()根据文件名前缀和后缀自动生成给定文件夹中的唯一文件名.

File file = File.createTempFile("somefilename-", ".ext", new File("/path/to/uploads"));
uploadedFile.write(file.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

也可以看看: