【问题标题】:Opening a resource file in a servlet on Openshift在 Openshift 上的 servlet 中打开资源文件
【发布时间】:2013-06-29 17:18:55
【问题描述】:

我无法在我的网络应用程序中打开文件。我在 Eclipse 中本地尝试了它,它工作正常,但是当我尝试在 Openshift 上的 Tomcat 6 上部署它时,它找不到我的网络应用程序的资源文件。在WEB-INF目录下存放了ProjectFiles目录下的一些txt文件;本地打开文件的代码是

String nome_file = "C\:\\Users\\miKKo\\workspace\\fantacalcio_project\\WebContent\\WEB-INF\\ProjectFiles\\Risultati\\risultati_" + nome_lega + ".txt"; 

BufferedReader reader = new BufferedReader(new FileReader(nome_file));

我已将它们推送到同一存储库中的 Git 中(在服务器上,我将我的项目重命名为“ROOT”),并用此替换了字符串

String nome_file = this.getServletConfig().getServletContext().getContextPath()+"/WebContent/WEB-INF/ProjectFiles/Risultati/risultati_" + nome_lega + ".txt";

但它不起作用。我也尝试过使用上下文属性

/var/lib/openshift/51c6178a5004467630000019/jbossews/work/Catalina/localhost/_/WEB-INF/ProjectFiles

但抛出的异常总是

java.io.FileNotFoundException: (#path)(没有这样的文件或目录)

我能做些什么呢?

【问题讨论】:

  • 我也尝试过在 servlet 和 JSP 页面中使用 System.getenv("$OPENSHIFT_REPO_DIR") 和 System.getenv("$OPENSHIFT_DATA_DIR") 但它们都返回空字符串。我不知道为什么

标签: java tomcat servlets deployment openshift


【解决方案1】:

假设您的文件位于以下位置:

/WEB-INF/ProjectFiles/Risultati/risultat_text_file.txt

然后使用:

String path = "/WEB-INF/ProjectFiles/Risultati/risultat_text_file.txt";
InputStream inputStream =  new FileInputStream(this.getServletConfig().getServletContext().getRealPath(path));

应该适合你。注意,ServletContext.getRealPath() 返回给定虚拟路径对应的真实操作系统路径。

编辑:

如果这对您的情况不起作用,您确实需要重新访问您的虚拟路径。您可以手动检查此文件是否存在于 war 文件的预期目录中,或者您可以记录 getRealPath() 方法的输出以检查实际情况!如有必要,您可以将 "/" 放入您的 getRealPath() 方法并检查您的应用程序的根路径是什么。

【讨论】:

  • 不行,我试过这样 String path="/WEB-INF/ProjectFiles/Risultati/risultati_test.txt"; InputStream inputStream = new FileInputStream(this.getServletConfig().getServletContext().getRealPath(path)); BufferedInputStream reader = new BufferedInputStream(inputStream);此外,我需要读取文件并使用 BufferedReader 类的 readLine() 等方法,而 BufferedInputStream 没有。
  • 您是否记录了 getRealPath() 方法返回的路径?你看到了什么?
  • getRealPath() 返回并转换为字符串的 inputStream 对象是 java.io.FileInputStream@60af0b 对不起,如果我不明白这个东西
  • 只打印输出波纹管代码:this.getServletConfig().getServletContext().getRealPath(path)
  • 然而,昨天我用属性文件解决了另一个问题,在这种情况下 Properties properties = new Properties(); InputStream prop_link=getServletContext().getResourceAsStream("/WEB-INF/fantacalcio.properties");属性.load(prop_link);但是对于这个文件我没有成功
【解决方案2】:

由于我没有得到应用程序的root realpath,我是这样解决的:

String path="/WEB-INF/ProjectFiles/Risultati/risultati_test.txt";
InputStream inputStream = this.getServletConfig().getServletContext().getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

现在它可以工作了。顺便说一句,我也在这里找到了有用的信息

getResourceAsStream() vs FileInputStream

【讨论】:

  • this.getServletConfig().getServletContext()可以简化为this.getServletContext()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多