Java 在JSF2.2中上载文件

Java 在JSF2.2中上载文件,java,file-upload,jsf-2,tomcat7,Java,File Upload,Jsf 2,Tomcat7,使用我公司选择的云存储api,刚刚开始使用JSF2.2。尝试构建一个简单的图像上传web应用程序,当我使用Eclipse在本地运行时,它就可以工作了 以下是代码: .xhtml页面 <h:form id="form" enctype="multipart/form-data" prependId="false"> Select id Photo: <h:inputFile id="file" value="#{customerEntity.uploadedFile}"/>

使用我公司选择的云存储api,刚刚开始使用JSF2.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>
在本地计算机上,从部件对象uploadedFile提取文件名的代码生成正确的文件定位器(例如c:\pictures\mypix.jpg),以便在我的计算机上进行本地访问

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

 File source = new File(this.fileURI);
 try {
 cloud.upload(new FileInputStream(source), source.length());
我的调试语句显示它正在使用本地pc上的文件定位器,而服务器上显然不存在该定位器。我不知道如何将本地文件数据流式传输到服务器上运行的代码

作为一个jsf新手,我确信这是显而易见的,但我无法通过我看到的其他帖子来理解或解决


任何指导都将不胜感激

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

  • 当您使用不会暴露安全漏洞的webbrowser时,文件的路径将完全缺失,即完整的客户端路径包含在上载文件的名称中(即Internet Explorer以外的任何浏览器)

  • 只有当webbrowser(用于发送文件)和webserver(用于检索文件)在物理上运行在同一台机器上时,才能在客户端指定的路径/名称上使用
    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());
    
    另见:

    哇-惊人的转变,你的答案正是我所需要的-谢谢!(注意-作为一名stackoverflow新手,我没有足够的代表分数来投票)
    File file = File.createTempFile("somefilename-", ".ext", new File("/path/to/uploads"));
    uploadedFile.write(file.getAbsolutePath());