我正在尝试通过文件上传的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
我不确定为什么文件名被附加到目录路径。对此的任何帮助都非常感谢。
答案 0 :(得分:2)
当您尝试将上传的文件保存到文件"uploadedFileName/directory"
时,您正在使用相对文件路径。它与java进程的当前工作目录相关(java进程,运行Tomcat Application Server或您正在使用的任何应用程序服务器)。而且当前的工作目录不是您的项目根目录。以下代码:
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
是否包含错误字符。
答案 1 :(得分:0)
上传文件时,必须将其保存到其他文件。
您应该使用File#createTempFile()
代替目录。
<p style="border-style:solid; border-color:#FFFFFF;">
<br>
File file = File.createTempFile("upload-", ".bin", new File("/path/to/your/uploads"));
<br><br>
item.write(file);
<br><br></p>
&#13;