一尘不染

战争Webapp中的Tomcat服务器绝对文件访问

tomcat

我有一个Spring webapp,其.war文件已上传到Tomcat服务器。大多数基本功能均按预期工作-页面视图和表单提交。

我现在的问题是我的Web应用程序需要读取和写入文件,而我对如何实现这一点一无所知(文件I /
O返回java.lang.NullPointerException)。

我使用以下代码来获取TitiWangsaBinDamhore建议的给定文件的绝对路径,以了解相对于服务器的路径:

HttpSession session = request.getSession();
ServletContext sc = session.getServletContext();
String file = sc.getRealPath("src/test.arff");
logger.info("File path: " + file);

这是输出路径:

/home/username/tomcat/webapps/appname/src/test.arff

但是,当我通过WinSCP检查文件目录时,文件的实际路径为:

/home/username/tomcat/webapps/appname/WEB-INF/classes/test.arff

这是我的问题

  1. 我如何将这些路径转换为类似的东西C:/Users/Workspace/appname/src/test.arff(本地机器上的原始路径可以正常工作)?服务器是Apache Tomcat 6.0.35Apache Tomcat 6.0.35
  2. 为什么代码返回的路径与实际路径不同?
  3. 如果文件I / O不适用,我可以使用哪些替代方法?

PS
我只需要访问两个文件(<1MB的每个),所以我不认为我可能需要使用数据库中包含他们所建议减去在此线程。

文件I / O

以下是用于访问所需文件的代码。

BufferedWriter writer;
    try {
        URI uri = new URI("/test.arff");
        writer = new BufferedWriter(new FileWriter(
            calcModelService.getAbsolutePath() + uri));

        writer.write(data.toString());
        writer.flush();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }

阅读 199

收藏
2020-06-16

共1个答案

一尘不染

读取文件:

ServletContext application = ...;
InputStream in = null;

try {
  in = application.getResourceAtStream("/WEB-INF/web.xml"); // example

  // read your file
} finally {
  if(null != in) try { in.close(); }
   catch (IOException ioe) { /* log this */ }
}

写入文件:

ServletContext application = ...;
File tmpdir = (File)application.getAttribute("javax.servlet.context.tempdir");

if(null == tmpdir)
  throw new IllegalStateException("Container does not provide a temp dir"); // Or handle otherwise

File targetFile = new File(tmpDir, "my-temp-filename.txt");
BufferedWriter out = null;

try {
  out = new BufferedWriter(new FileWriter(targetFile));

  // write to output stream
} finally {
  if(null != out) try { out.close(); }
  catch (IOException ioe) { /* log this */ }
}

如果您不想使用servlet容器提供的tmpdir,则应该使用完全不在servlet上下文所能提供的范围之内的类似之类的/path/to/temporary/files东西。您绝对不希望将容器的临时目录用于除真正的临时文件以外的其他任何东西,这些文件可以在重新部署后删除,等等。

2020-06-16