我是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
答案 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();
}