问题背景:
我正在尝试将用户上传的文件保存到文件系统。
说明
实际上,我正在使用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
(系统找不到指定的路径)“。
以下是目录结构:
答案 0 :(得分:4)
您不应将上传的文件存储在公共网页内容中。
将它们存储在服务器的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()
获取与给定虚拟路径对应的真实路径。 例如,如果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
。
<强>资源:强>