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

Java Spring MVC:FileNotFoundException\Uploads\MyUploads\loading.gif(系统找不到指定的路径)";,java,servlets,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.trans

问题背景:

我正在尝试将用户上传的文件持久化到文件系统

说明:

实际上,我正在使用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
(系统找不到指定的路径)”

下面是目录结构:


确保在使用文件之前添加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文件的JAR文件中解包时,才能考虑捆绑在应用程序的/WEB-INF/lib目录中的JAR文件的/META-INF/Resources目录中的资源,在这种情况下,必须返回解包位置的路径。 如果servlet容器无法将给定的虚拟路径转换为实际路径,则此方法返回null

试试这个

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

资源:

  • 这里也在讨论类似的问题

您不应将上载的文件存储在公共web内容中

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

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

谢谢它的工作。但文件仍保存在构建目录中。是否有任何方法可以在根应用程序中保存此图像。因为每次我构建项目时,所有上传的文件都会被清理。因此,我需要将此图像保存在根目录或web文件夹中(使用CSS和Js文件夹)。请help@user960567,当您的应用程序部署到生产环境中时,您的根目录将不可用(即开发版本),您需要使用数据库来存储信息,或者,这些文件不会在生产环境中消失,因为您不会重新部署。这不起作用。我也犯了同样的错误。我的外观实际上与我们在ASP.NET环境中使用的相同,比如Server.MapPath或以~开头的字符串sign@Adeel安萨里,你能解释一下为什么这是个坏主意吗?@epoch:仅仅是因为你试图读取一个实际驻留在应用程序中的资源。我们不需要使用
getRealPath()
。此外,如果应用程序是从捆绑的
.war
文件运行的,
getRealPath()
将返回
null
@AdeelAnsari,这不是一个坏主意,我在生产系统中使用它,它确保虚拟路径正确映射到应用程序根目录。此外,这不是真的,web容器仍然有一个servlet上下文,它将返回null的唯一原因是上下文不存在或转换无法进行performed@epoch:希望这条线索能把事情弄清楚。没什么帮助。你的意思是我应该给出绝对路径,例如C:\webapps\。。。。但我认为这是一个坏主意,因为在应用程序部署到原始服务器之前,我不知道它的绝对位置。这正是您需要通过属性文件或VM参数(如答案中所述)对其进行配置的原因。如果你觉得这是个坏主意,好吧,但是一旦你在某个时候丢失了所有上传的文件,就不要向我抱怨。谢谢。然而,我在ASP.NET框架中没有看到这些类型的问题,比如ASP.NET MVC。@user960567:ASP.NET或其他任何东西,这个建议仍然有效。@adeel ansari:你是什么意思?。顺便说一句,我同意balus的观点,我应该使用配置键来存储根绝对路径或使用数据库。答案可能会有所帮助