Spring MVC:FileNotFoundException“\ Uploads \ MyUploads \ loading.gif(系统找不到指定的路径)”

时间:2011-09-27 07:10:05

标签: java servlets

问题背景:

我正在尝试将用户上传的文件保存到文件系统。

说明

实际上,我正在使用Spring MVC(3.0),这就是我试图保留文件的方式,

String orgName = file.getOriginalFilename();
String filePath = "/Uploads/MyUploads/"+ new Date().getTime()+orgName;// Unique Image Name
File dest = new File(filePath);
file.transferTo(dest);

我的应用程序根目录下有一个文件夹Uploads\MarketplaceUploads。但我仍然得到FileNotFoundException "\Uploads\MyUploads\loading.gif(系统找不到指定的路径)“。

以下是目录结构:

enter image description here

3 个答案:

答案 0 :(得分:4)

您不应将上传的文件存储在公共网页内容中。

  • 当容器未扩展WAR时,它不会以任何方式工作(这可以在服务器级别配置,并且只要它是第三方主机就不可控制)。您无法以任何方式将上传的文件写入其中。
  • 每次重新部署WAR(更新)时,所有上传都会丢失。你需要记住每次都备份它们。
  • 在某些服务器中,重新启动服务器时,所有上传内容也会丢失。只要它是第三方主机,您就无法控制它。

将它们存储在服务器的webapps文件夹之外。提供此位置的根目录作为Webapp的绝对磁盘文件系统路径,例如通过属性文件或VM参数。另一种方法是将它们存储在数据库中,如果它是第三方主机,它不能访问Web内容之外的固定位置,这通常是唯一的解决方案。

答案 1 :(得分:3)

确保在使用文件

之前添加Web应用程序上下文路径
String orgName = file.getOriginalFilename();
String filePath = getServletContext().getRealPath("/") + "/Uploads/MyUploads/"+ new Date().getTime()+orgName;// Unique Image Name
File dest = new File(filePath);
file.transferTo(dest);

来自getRealPath()

的javadoc
  

获取与给定虚拟路径对应的真实路径。   例如,如果path等于/index.html,则此方法将返回服务器文件系统上的绝对文件路径,其中将映射http://://index.html形式的请求,其中对应于此ServletContext的上下文路径。   返回的实际路径将采用适合运行servlet容器的计算机和操作系统的形式,包括正确的路径分隔符。   只有当容器从包含的JAR文件中解压缩它们时,必须考虑捆绑在应用程序的/ WEB-INF / lib目录中的JAR文件的/ META-INF / resources目录中的资源,在这种情况下,解压缩位置的路径必须被退回   如果servlet容器无法将给定的虚拟路径转换为实际路径,则此方法返回null。

答案 2 :(得分:2)

试试这个,

String orgName = file.getOriginalFilename();
// the leading slash is important
String filePath = "/Uploads/MyUploads/"+ new Date().getTime()+orgName; 
File dest = new File(req.getServletContext().getResource(filePath).toURI());
file.transferTo(dest);

使用getRealPath()确实是一个坏主意。简单地说,因为您正在尝试读取实际驻留在应用程序内的资源。因此,我们不需要使用getRealPath()。此外,如果应用程序是从捆绑的.war文件运行的,getRealPath()将返回null

<强>资源: