使用Spring将文件存储在项目目录中

时间:2015-02-27 15:22:56

标签: java spring file

我正在尝试通过文件上传的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

我不确定为什么文件名被附加到目录路径。对此的任何帮助都非常感谢。

2 个答案:

答案 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;
&#13;
&#13;