0

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

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

这是下载文件的控制器代码。

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 (No such file or directory)

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

结构体

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

4

2 回答 2

1

由于您的文件位于资源目​​录中,因此您需要将其称为类路径资源。类路径上的资源可以存在于目录结构中,也可以存在于诸如 jar 或 war 之类的档案中。在您的情况下,您的本地环境在文件系统上有这些文件,但是在部署时,它们最终会发生战争。

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

访问这些文件的正确方法是使用类加载器。您可以调用 getResourceAsStream 并将位置提供给资源。在您的情况下,它将如下所示:

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

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

于 2013-03-10T22:54:44.717 回答
0

这应该有效:

InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("MyDocument.docx");
于 2013-03-10T22:22:45.553 回答