File upload REST应用程序中无HttpRequest文件上载的上下文路径

File upload REST应用程序中无HttpRequest文件上载的上下文路径,file-upload,spring-mvc,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) {

我正在构建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";
}

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

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

您应该将文件存储在哪里取决于您想对它们执行什么操作,以及您运行的操作系统。我的建议是,只需选择webapp本身之外的地方。也许可以创建一个专用目录

此外,将
多部分文件
传输到另一个位置的过程比您想象的要简单得多:

@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";
}

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

您应该将文件存储在哪里取决于您想对它们执行什么操作,以及您运行的操作系统。我的建议是,只需选择webapp本身之外的地方。也许可以创建一个专用目录

此外,将
多部分文件
传输到另一个位置的过程比您想象的要简单得多:

@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";
}

您不应该将文件存储在
/WEB-INF/resource/uploads
中。这个目录要么在WAR中(如果打包的话),要么在servlet容器中的某个地方分解。第一个目标是只读的,后者不应用于用户文件

存储上传的文件时,通常考虑两个位置:

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

  • 数据库。这是有争议的,因为二进制文件往往会占用大量空间。但在分发应用程序时,这种方法要简单一些


  • 您不应该将文件存储在
    /WEB-INF/resource/uploads
    中。这个目录要么在WAR中(如果打包的话),要么在servlet容器中的某个地方分解。第一个目标是只读的,后者不应用于用户文件

    存储上传的文件时,通常考虑两个位置:

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

  • 数据库。这是有争议的,因为二进制文件往往会占用大量空间。但在分发应用程序时,这种方法要简单一些


  • 那太好了。短得多,简单得多,好得多:)谢谢你,太好了。更简短、更简单、更好:)谢谢你是的,我知道我可以使用DB,但我不想。I want上载将显示在页面(大部分)图像上的用户文件。因此,我应该创建像/var/www/project/user\u uploads这样的目录,然后从那里抛出文件并上传到那里。如果我错了,请纠正我,但浏览器不能访问
    /var/www/
    目录吗?这意味着每个用户都可以在没有您控制的情况下访问任何fil。这可能是一个优势(原始Apache访问速度很快),但如果您想应用更严格的安全模型,这也是一个安全漏洞。确实如此,但我只能从Apache限制对此目录的访问。只有图像文件,所以如果有人访问它,就不会有大的戏剧性。但是我同意你的匿名FTP文件夹的例子是更好的Tomasz你会这么好,并把我链接到一些样本如何做一个适当的文件管理?这很悲哀,但我在上传文件和在网站上显示文件时遇到了问题:(我想我的问题是在restful应用程序中。当我想从本地硬盘上显示和显示图像时,我得到了404。我应该如何配置它?是的,我知道我可以使用DB,但我不想。我想上传将显示在页面上的用户文件(主要是)图像。所以我应该创建像/var/www/project/user\u uploads这样的目录,然后从那里抛出文件并上传到那里。如果我错了,请纠正我,但浏览器不能访问
    /var/www/
    目录吗?这意味着每个用户都可以在没有您控制的情况下访问任何fil。这可能是一个优势(原始Apache访问速度很快),但如果你想应用更严格的安全模型,这也是一个安全漏洞。没错,但我只能限制从apache访问此目录。只有图像文件,因此,如果有人访问它,将不会有大的戏剧性。但我同意,你的匿名FTP文件夹的示例更好。托马斯兹,你能这么好,并将我链接到某个samp吗le如何正确管理文件?这很遗憾,但我在上传文件和在网站上显示文件时遇到了问题:(我认为我的问题是在restful应用程序中。当我想从本地硬盘显示和映像时,我得到了404。我应该如何配置它?