繁体   English   中英

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

[英]How to store uploaded file in project folder in Java

我是Java Web的新手,目前正在尝试将上传的文件(带有servlet)存储在项目中的文件夹中。 在web.xml中,我可以分隔完整路径,但是完整路径在其他人的计算机中会有所不同,并且无法正常工作,因此如何将上传的文件存储在我正在使用的项目中的文件夹中。 我的web.xml看起来像这样:

<web-app>
...
<context-param> 
    <description>Location to store uploaded file</description> 
    <param-name>file-upload</param-name> 
    <param-value>
        C:\Users\George\Desktop\dataFolder\
     </param-value> 
</context-param>
...
</web-app>

但我想使路径看起来像这样:thisProject \\ dataFolder

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

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

Web应用程序非常特殊,您并不真正知道它们将被部署在哪里,您不能对工作目录承担太多责任,一旦部署,将不会有像项目文件夹这样的东西。

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

如果将这样的参数放在web.xml中,则可以使用服务器设置覆盖它,如何使用它取决于所使用的应用程序服务器。

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

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

如果无法在自己的IDE中进行设置,则仍可以在OS中将其设置为用户变量或系统变量。

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

你们每个人和您的朋友只需要设置一次。

您也可以将此类信息存储在DB上或使用特定于容器的机制。

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

myProject-> WEB-INF-> 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,将重要内容保存在其中会更安全。

当您在servlet中获取文件的字节时,只需在Java中使用fileoutputstream写入即可

例如

部分p = request.getpart(“ file”);

Inputstream是= p.getinputstram();

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

FileOutputStream fos = null;

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

fos = new FileOutputStream(“ C://test.txt”);

//将字节写入输出流

fos.write(b)中;

//将内容刷新到基础流

fos.flush();

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

ex.printStackTrace();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM