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

ファイルはresourcesディレクトリにあるため、クラスパスリソースとして参照する必要があります。クラスパス上のリソースは、ディレクトリ構造、または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 に答える