gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:47:01 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com