REST应用程序中没有Http请求的文件上载的上下文路径

时间:2012-01-08 21:41:26

标签: file-upload spring-mvc

我正在构建REST应用程序。我想上传一个文件,我想保存它,例如在/ WEB-INF / resource / uploads

如何获取此目录的路径?我的控制器看起来像这样

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST)
public String updateHouse(House house, @RequestParam("file") MultipartFile file, Model model) {
    try {
        String fileName = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        if (file.getSize() > 0) {
                inputStream = file.getInputStream();

                fileName =  "D:/" + file.getOriginalFilename();
                outputStream = new FileOutputStream(fileName);

                int readBytes = 0;
                byte[] buffer = new byte[10000];
                while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) {
                        outputStream.write(buffer, 0, readBytes);
                }
                outputStream.close();
                inputStream.close();
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }

    model.addAttribute("step", 3);
    this.houseDao.update(house);
    return "houseAdmin";
}

第二个问题...上传用户文件的最佳位置是什么?

2 个答案:

答案 0 :(得分:2)

/WEB-INF是尝试存储文件上传的不好的地方。不能保证这是磁盘上的实际目录,即使它是,appserver也可以禁止对它进行写访问。

您应该存储文件的位置取决于您要对它们执行的操作以及您正在运行的操作系统。只是选择webapp之外的某个地方,是我的建议。也许创建一个专用目录

此外,将MultipartFile转移到另一个地点的过程要比实现目标简单得多:

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST)
public String updateHouse(House house, @RequestParam("file") MultipartFile srcFile, Model model) throws IOException {
    File destFile = new File("/path/to/the/target/file");
    srcFile.transferTo(destFile); // easy!

    model.addAttribute("step", 3);
    this.houseDao.update(house);
    return "houseAdmin";
}

答案 1 :(得分:1)

您不应将文件存储在/WEB-INF/resource/uploads中。此目录位于WAR内(如果已打包)或在servlet容器内的某处展开。第一个目标是只读的,后者不应该用于用户文件。

存储上传文件时通常会考虑两个地方:

  1. 某些专用文件夹。确保用户无法直接访问此目录(例如匿名FTP文件夹)。请注意,一旦您的应用程序在多台计算机上运行,​​您将无法访问此文件夹。因此,请考虑某种形式的网络同步或共享网络驱动器。

  2. <强>数据库即可。这是有争议的,因为二进制文件往往占用大量空间。但是,在分发应用程序时,这种方法会更简单。