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

标签 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

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

最佳答案

当您尝试将上传的文件保存到文件“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/

相关文章:

Java如何在更改后重置 "set"值

java - 在heroku上扩展SpringWebFlow应用程序时出现问题

python - 如何在 Python 中对文本文件中的数字求和

java - 如何拆分平台独立的路径?

java - 对字符串 ArrayList 使用选择排序

java - 隐形 JComboBox

java - 如何在 spring boot 中从属性文件为 @Order 注释设置值

java - 无法做出正确的请求 Resttemplate

c++ - 程序总是产生相同的值(value)?

java - GWT 的第三方 API