3

サーブレットがURLに基​​づいて現在の場所をマップすることを読みました。Home.jspページのボタンをクリックすると、サーブレットであるExcelUploaderに移動します。上記のボタンがクリックされたときのURLは

http://localhost:8080/ServletExample/ExcelUploader

JSPと同じフォルダにあるExcelファイルを開こうとしています。つまり、上記のURLに対して1つのフォルダーを上に移動する必要があります。私はこれをサーブレットに持っています:

 InputStream inp = new FileInputStream("../OpenMe.xls");

しかし、私はまだ取得しています

java.io.FileNotFoundException:.. \ OpenMe.xls(システムは指定されたファイルを見つけることができません)

これが私のプロジェクトの設定方法です。

プロジェクトの設定

4

2 に答える 2

3

FileInputStream、作業ディレクトリに関連するローカルディスクファイルシステムで動作し、JavaEEWebアプリケーションから呼び出されるという事実についてはまったく何も知りません。渡される相対パスは、サーバーを起動するコマンドが実行されたときに開かれたフォルダーからの相対パスです。多くの場合、これはサーバー自体のインストールフォルダーですが、IDEの場合は、プロジェクト自体のルートフォルダーにすることもできます。この変数は、Javaコード内から制御することはできません。あなたはそれに頼るべきではありません。

パブリックWebコンテンツのリソースとしてファイルを保存しました。ServletContext#getResourceAsStream()したがって、を返すWebコンテンツリソースとして利用できますInputStream。ファイル自体のURLを使用するだけでなく、そのURLでサーブレットを呼び出す正当な理由がある場合はhttp://localhost:8080/ServletExample/OpenMe.xls、次のようになります。

InputStream input = getServletContext().getResourceAsStream("/OpenMe.xls");
// ...

サーブレットのみによるファイルのアクセスを制限することが目的の場合は、ファイルを/WEB-INFフォルダに移動して、エンドユーザーがファイル自体のURLを入力してファイルを直接開くことができないようにすることを検討してください。それに応じてリソースパスを変更するだけで済みます。

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/OpenMe.xls");
// ...

getRealPath()他の回答で示唆されているように使用するべきではありません。これは、servletcontainerがWARファイルをローカルディスクファイルシステムではなくメモリに拡張するように構成されている場合は機能しません。これは、サードパーティのホストでよくあることです。その後、戻りnullます。

参照:

于 2012-06-28T17:00:10.850 に答える
2

Web ツリーに存在するファイルのパスは、次のように、使用可能になる前にgetRealPathを使用して「変換」する必要があります。

File excelFile = new File(getServletContext().getRealPath("/OpenMe.xls"));

その間、デフォルトのパッケージを使用することはお勧めできません。ファイル用のパッケージを作成してください。

于 2012-06-28T15:43:19.840 に答える