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新手,我确信它是显而易见的,但无法弄明白或通过我见过的其他帖子解决.
任何指导将不胜感激!
你犯了一个相当重大的概念错误.您不应对上载文件的客户端指定路径/名称感兴趣.相反,您应该对上传文件的内容感兴趣.而且由于两个主要原因:
当您使用webbrowser时,该文件的路径将完全不存在,该web浏览器不会暴露安全错误,即完整客户端路径包含在上载文件的名称中(即除Internet Explorer之外的任何浏览器).
使用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)