java - 在jsf 2.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>

customerEntity.java代码:

private Part uploadedFile;
private String fileURI;

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

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

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

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

作为一个轻微的 jsf 新手,我确信这是显而易见的事情,但无法通过我看到的其他一些帖子弄清楚或解决。

任何指导将不胜感激!

最佳答案

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

  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());

另见:

关于java - 在jsf 2.2中上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690641/

相关文章:

java - 将返回值分配给新变量(Java)

java - 矩形类和 containsPoint 方法

java - 使用Reflections动态加载包中的所有类

javascript - 将 JSON 数据上传为文件

php - Uploadify-操作完成,但未进行上传

java - JSF2 ResourceBundleLoader 重写?

html - jsf 页面的中心组件

java - 如何防止记录器写入日志文件的多个实例?

php - 无法在 Hostgator 中上传大于 1Mb 左右的文件

jsf-2 - 创建不带 windowid 参数的 JSF URL