如何在Java中的项目文件夹中存储上传的文件

时间:2017-06-10 21:36:49

标签: java file servlets

我是Java web的新手,目前我正在尝试将上传的文件(带有servlet)存储在项目中的文件夹中。在web.xml中我可以sepcify完整路径,但完整路径将在别人的计算机中不同,它将无法工作,那么如何将上传的文件存储在我正在使用的项目中的文件夹中。 我的web.xml看起来像这样:

struct Beta {
  Beta_ab ab;
  Beta_ab && getAB() { cout << "2"; return move(ab); }
};

int main() {
    Beta b;
    Beta_ab ab = b.getAB();

    return 0;
}

但我想让路径看起来像:thisProject \ dataFolder

3 个答案:

答案 0 :(得分:0)

有几种方法可以做到,但要点是:

您使用绝对路径并使其部署依赖。

Webapps非常特别,你真的不知道它们的部署位置,你不能对你的工作目录有很多假设,没有像项目文件夹那样的一旦部署。

因此,如果您需要一个文件夹来放置上传的文件,您只需假设您将拥有一个并使用参数来定位它。

如果您将此参数放在web.xml中,则可以使用服务器设置覆盖它,如何执行此操作取决于您使用的应用程序服务器。

设置部署特定设置的另一种方法是使用环境变量。因此,您可以定义一个环境变量,如MYAPP_FILESTORAGE,并在此变量中设置文件上传的实际路径。

在eclipse中(我认为其他IDE也有类似的机制),您可以为应用程序RUN / DEBUG设置环境变量。

如果您无法在ide中设置它,您仍然可以在操作系统中将其设置为用户变量或系统变量。

因此,在您的项目中,不会成为路径的硬编码引用,而是由环境变量解析的逻辑引用。

你和你的朋友都需要设置一次。

您还可以将此类信息存储在数据库中或使用特定于容器的机制。

答案 1 :(得分:0)

当我自己制作这个确切的项目时遇到了同样的问题。我做的是我只在我的projectApp中创建了存储目录。它是 myProject / WEB-INF / saveFiles 。因此,我的下载不仅限于任何机器。我可以在我的ubuntu / windows / mac中使用它没有任何问题。既然你已经知道为什么不应该使用绝对路径,那么让我们来解决。在你的servlet代码中。假设你的存储目录是 FileStorage ,你的应用程序结构是

myProject - &gt; WEB-INF - &gt; FileStorage

  /*  Get the directory location.myContextPath is the path of your 
      application. It will return "somepath/myProject/". */
      File storageDirectory=new File(request.myContextPath()+"/WEB-INF/FileStorage");

    //Now check if the directory is already created or not.If its not created,then it means your application is being run for the 1st time on this machine.
    if(!storageDirectory.exists())
         storageDirectory.mkdir();

现在你已经拥有了一个独立于平台的存储目录。现在你可以继续保存文件了。 注意:可以说,为什么我选择FileStorage位置为 myProject / WEB-INF / FileStorage 而不是 myProject / FileStorage 。我做到了所以因为WEB-INF以外的任何东西都可以被用户直接访问。只有WEB-INF里面的内容不能直接访问。把重要内容保存在那里更安全。

答案 2 :(得分:0)

当你在servlet中获取文件的字节时只需使用java中的fileoutputstream来编写它

例如

部分p = request.getpart(&#34;文件&#34;);

输入流是= p.getinputstram();

byte [] b = IOutils.getbytes(is);

FileOutputStream fos = null;

尝试{  //创建新文件输出流

fos = new FileOutputStream(&#34; C://test.txt");

//将字节写入输出流

fos.write(B);

//将内容刷新到基础流

fos.flush();

catch(Exception ex){ //如果发生错误

ex.printStackTrace();

}