Yat*_*oel 32 java web-applications
我想从java Web应用程序中读取文件.我不想给出文件的绝对路径.我只想将文件放在我的Web应用程序的某个目录中.
要么
它可以与.war文件(打包的Web应用程序)一起放置.
给文件的相对路径是什么.我试过./filename.csv但它没用.
========
我将向WAR我的客户端提供一个文件(打包的Web应用程序).此Web应用程序将读取一个文件(假设SuppliedFile.csv),该文件将由客户端复制到服务器.所以我需要一种机制(无论应用程序服务器是否会打开它都能工作WAR),以便Web应用程序可以读取该文件.
注意:
我没有SuppliedFile.csv在servlet中使用...我在普通的Java类中使用它...
Thi*_*ilo 28
你真的需要从文件中加载它吗?如果将它放在类中(在WEB-INF/classes中),可以使用类加载器为它获取一个InputStream:
InputStream csv =
SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");
Run Code Online (Sandbox Code Playgroud)
Mar*_*ouf 14
您可以简单地访问系统上预先安排的文件路径.这是首选,因为添加到webapp目录的文件可能会丢失,或者webapp可能无法解压缩,具体取决于系统配置.
在我们的服务器中,我们在App Server的JVM中定义了一个系统属性集,该属性指向应用程序外部数据的"主目录".当然这需要修改App Server的配置(-DAPP_HOME = ...在启动时添加到JVM_OPTS),我们这样做主要是为了简化在App Server上下文之外运行的代码的测试.
您可以轻松地从servlet配置中检索路径:
<web-app>
<context-param>
<param-name>MyAppHome</param-name>
<param-value>/usr/share/myapp</param-value>
</context-param>
...
</web-app>
Run Code Online (Sandbox Code Playgroud)
然后检索此路径并将其用作读取客户端提供的文件的基本路径.
public class MyAppConfig implements ServletContextListener {
// NOTE: static references are not a great idea, shown here for simplicity
static File appHome;
static File customerDataFile;
public void contextInitialized(ServletContextEvent e) {
appHome = new File(e.getServletContext().getInitParameter("MyAppHome"));
File customerDataFile = new File(appHome, "SuppliedFile.csv");
}
}
class DataProcessor {
public void processData() {
File dataFile = MyAppConfig.customerDataFile;
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,您遇到的最可能的问题是安全限制.没有什么能保证webapps可以在webapp根目录之上准备好任何文件.但是通常有一些简单的方法可以为特定Web应用程序的特定路径授予例外.
无论您需要访问此文件的代码如何,因为您在Web应用程序中运行,所以您可以保证首先对其进行初始化,并且可以将其值存储在方便其他代码引用的位置,如在我的例如或更好,只需将路径作为参数传递给需要它的代码.
如果Web服务器中有该文件的路径,则可以使用ServletContext.getRealPath()获取服务器文件系统中的实际路径.请注意,不保证在每个容器中都可以工作(因为不需要容器来解压缩WAR文件并将内容存储在文件系统中 - 尽管如此).我想它不适用于/ WEB-INF中的文件,因为它们没有虚拟路径.
另一种方法是使用返回URI的ServletContext.getResource().此URI可能是"file:"URL,但不保证这一点.
| 归档时间: |
|
| 查看次数: |
139636 次 |
| 最近记录: |