我有一个 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目录,文档就在那里(为了公司隐私,没有截图实际文档)。
我猜这与类路径或其他东西有关。但我不知道我到底需要更新什么或如何更新。
最佳答案
由于您的文件位于资源目录中,因此您需要将其作为类路径资源进行引用。类路径上的资源可以存在于目录结构或存档(例如 jar 或 war)中。就您而言,您的本地环境在文件系统上有这些文件,但是部署时,它们最终会陷入 war 。
访问类路径资源时,FileInputStream 不是一个好的选择。
访问这些文件的正确方法是使用类加载器。您可以调用 getResourceAsStream 并提供资源的位置。在你的情况下,它看起来像这样:
InputStream is = getClass().getClassLoader()
.getResourceAsStream("/downloads/MyDocument.docx")
这将使用用于加载当前类的类加载器。
关于Java Maven 应用程序下载在本地运行但不能在服务器上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15328315/