2012-01-08 51 views
0

我正在构建REST应用程序。我想上传一个文件,并且想要将其保存在例如/ WEB-INF/resource/uploads中在REST应用程序中没有HttpRequest的文件上传上下文路径

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

@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

/WEB-INF是尝试存储文件上传的不利位置。不能保证这是磁盘上的实际目录,即使是这样,应用程序服务器也可能禁止对其进行写入访问。

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

此外,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"; 
} 
+0

很好。更短,更简单,更好:)谢谢 – Fixus 2012-01-08 22:11:07

1

你不应该存储在/WEB-INF/resource/uploads文件。这个目录在你的WAR中(如果打包)或者在servlet容器内的某个地方爆炸。第一个目标是只读的,后者不应该用于用户文件。

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

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

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

+0

是的我知道我可以使用数据库,但我不想。我不想上传将显示在页面(主要是)图像上的用户文件。所以我应该创建类似/ var/www/project/user_uploads的目录并从那里抛出文件并上传到那里。 – Fixus 2012-01-08 22:12:16

+0

纠正我,如果我错了,但不是'/ var/www /'目录可从浏览器访问?这意味着每个用户都可以在不受您控制的情况下访问任何文件。这可能是一个优势(原始Apache访问速度很快),但如果您想要应用更严格的安全模型,也是一个安全漏洞。 – 2012-01-08 22:16:09

+0

真的,但我可以限制只能从Apache访问此目录。将只有图像文件,所以如果有人访问它不会是一个大戏。但我同意你的匿名FTP文件夹的例子更好 – Fixus 2012-01-09 10:55:51

相关问题