Java Maven 应用程序下载在本地运行但不能在服务器上运行

标签 java maven download classpath

我有一个 Maven/Spring/Java 应用程序,允许用户下载文件。这是我的应用程序的目录结构。

src
  main
    java
      com
        mycompany
          controller
            MyDownloadController
    resources
      downloads
        MyDocument.docx

这是下载文件的 Controller 代码。

File file = new File("src/main/resources/downloads/MyDocument.docx");

response.setContentType("application/docx");
response.setContentLength((int) file.length());
response.setHeader("Content-Disposition", "attachment; filename=\"MyDocument.docx\"");

DataInputStream inputStream = new DataInputStream(new FileInputStream(file));
ServletOutputStream outputStream = response.getOutputStream();

int length   = 0;
byte[] byteBuffer = new byte[4096];
while ((inputStream != null) && ((length = inputStream.read(byteBuffer)) != -1)) {
    outputStream.write(byteBuffer, 0, length);
}

inputStream.close();
outputStream.close();

在本地 Tomcat 服务器上一切正常。但是,当我尝试上传到服务器(Jelastic)时,收到 500 错误 java.io.FileNotFoundException: src/main/resources/downloads/MyDocument.docx(没有此类文件或目录)

我查看了服务器上的Tomcat目录,文档就在那里(为了公司隐私,没有截图实际文档)。

structure

我猜这与类路径或其他东西有关。但我不知道我到底需要更新什么或如何更新。

最佳答案

由于您的文件位于资源目​​录中,因此您需要将其作为类路径资源进行引用。类路径上的资源可以存在于目录结构或存档(例如 jar 或 war)中。就您而言,您的本地环境在文件系统上有这些文件,但是部署时,它们最终会陷入 war 。

访问类路径资源时,FileInputStream 不是一个好的选择。

访问这些文件的正确方法是使用类加载器。您可以调用 getResourceAsStream 并提供资源的位置。在你的情况下,它看起来像这样:

InputStream is = getClass().getClassLoader()
    .getResourceAsStream("/downloads/MyDocument.docx")

这将使用用于加载当前类的类加载器。

关于Java Maven 应用程序下载在本地运行但不能在服务器上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15328315/

相关文章:

java - 如何检测后台服务或 Android native 环境中的音量按钮单击?

java - 线程 "main"java.lang.AssertionError 中的异常

java - 根据 Activity 的 Spring 配置文件提供一个 Maven 依赖项

python - 将变量从命令行解析为 url

java - 如何使用 java 模拟损坏的应用程序/八位字节流

java - Android 电子市场 - 上传 APK 文件时出错

java - 空指针异常 : when trying to get user location from Facebook

java - 如何编辑不同类中主类中标签的颜色?

Java 命令行应用程序以某种方式保留状态

WPF : download files through CefSharp