2

使用我公司选择的云存储 api 并且刚开始使用 JSF 2.2。尝试构建一个简单的图像上传网络应用程序,当我使用 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>

customerEntity.java 代码:

private Part uploadedFile;
private String fileURI;

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

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

 File source = new File(this.fileURI);
 try {
 cloud.upload(new FileInputStream(source), source.length());

我的调试语句显示它正在使用来自我的本地电脑的文件定位器,这在服务器上显然不存在。我不知道如何将本地文件数据流式传输到服务器上运行的代码。

作为一个小小的 jsf 新手,我确信这很明显,但无法通过我看过的其他一些帖子弄清楚或解决。

任何指导将不胜感激!

4

1 回答 1

5

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

  1. 当您使用不会暴露完整客户端路径包含在上传文件名称中的安全漏洞的网络浏览器(即除 Internet Explorer 之外的任何浏览器)时,文件的路径将完全不存在。

  2. new File()仅当网络浏览器(用于发送文件)和网络服务器(用于检索文件)在物理上同一台机器上运行时,使用客户端指定的路径/名称才有效,因为它们已经访问完全相同的本地磁盘文件系统结构。这在现实世界中不会发生。

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

uploadedFile.write("/path/to/uploads/somefilename.ext");

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

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

也可以看看:

于 2013-09-09T02:24:57.103 回答