我正在尝试学习有关文件上传的 Spring 教程。我想做的是将文件保存到项目内的文件夹中。该文件夹称为“files”,与 src 文件夹分开。
|bin
|build
|src
|files
我有这个接受文件上传的代码:
public @ResponseBody String handleFileUpload(@RequestParam("name") String name,
@RequestParam("file") MultipartFile file){
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
BufferedOutputStream stream =
new BufferedOutputStream(new FileOutputStream(new File(name)));
stream.write(bytes);
stream.close();
//file.transferTo(); help?
return "You successfully uploaded " + name + "!";
我想要做的是使用transferTo()
将文件移动到“files”目录。当我尝试真实路径或尝试某种相对路径时,我收到此错误,该错误是在我上传文件的网络窗口中创建的。
Failed to upload file => "uploadedFileName/directory" does not exist
我不确定为什么文件名被附加到目录路径中。非常感谢对此的任何帮助。
最佳答案
当您尝试将上传的文件保存到文件“uploadedFileName/directory”
时,您正在使用相对文件路径。它相对于 java 进程(java 进程,运行 Tomcat 应用程序服务器或您正在使用的任何应用程序服务器)的当前工作目录。当前工作目录不是您的项目根目录。代码如下:
System.out.println(new File(name).getAbsolutePath())
将打印您尝试保存上传文件的确切路径。
要解决该问题,您必须显式指定项目根目录:
File rootDir = new File("C:/Projects/myTestProject");
File uploadedFile = new File(rootDir, name);
file.transferTo(uploadedFile);
在实际项目中,您不希望对 rootDir
路径进行硬编码,而是从某个配置文件中检索它。
不要依赖应用程序服务器的当前工作目录。它可以指向任何目录。
PS,这超出了这个问题的范围,但请小心将数据保存到用户提供的文件名。恶意用户可能会发布名为 "../../../../../../../../SomeSensitiveDirectory/SomeFile"
的文件,并且会覆盖该文件,除非您显式检查输入参数 name
是否存在错误字符。
关于java - 使用Spring在项目目录中存储文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28768474/