Web アプリケーションからファイルを読み取ることは、これを行うたびに苦しむ古典的な落とし穴です。
Web アプリ (特に Java EE) は、読み取り/書き込み操作にファイル システムを使用するようには考えられていません。コンテナー (この場合は Tomcat) が必要なリソースを取得する方法を知っているという事実に依存しています。
したがって、基本的なアドバイスは次のとおりです。それをしないでください。
しかし、私は基本的にこの種の回答が嫌いなので、アドバイスをします。
作業ディレクトリを使用しない
作業ディレクトリがどこにあるかはわかりません。多くの場合、実稼働システムでは、Web アプリには作業ディレクトリに書き込む権限がありません。
たとえば、webapp を tomcat サーバーにデプロイし、Windows マシンでサービスとして実行すると、作業ディレクトリは次のようになります。\Windows\System32
たとえば、アップロードされたファイルをそこに書き込みたくありません...
いくつかのオプションがあります。私が好むのは、パスを web-xml に設定し、おそらくサーバー構成から (コンテキストを使用して) オーバーライドすることです。
2 番目のオプションは、Web アプリがアクセスする db テーブルにパスを保存することです。
元:
設定したweb.xmlで
<context-param>
<description>Uploaded files directory</description>
<param-name>file-storage</param-name>
<param-value>c:\app\storage\uploaded</param-value>
</context-param>
次に、server.xml (または、コンテキスト dir を使用して、次のコードを含むファイルをそこに配置することもできます) で、この設定をコンテキストでオーバーライドします。
<Context
<Parameter
name="file-storage"
value="E:\app\storage\uploaded"
type="java.lang.String"
override="false" />
</Context>
Tomcat のドキュメントを確認する
3 番目のオプションは、少し幸せな状況で、一時ファイルだけを書きたい場合です。javax.servlet.context.tempdir という名前のサーブレット コンテキスト パラメータとしてアクセスできる webapp 作業ディレクトリがあり
ます。
もしあなたがどこにいるなら、私はデータベーステーブルに行きます.
この複雑さはすべて、Tomcat の異なるインスタンス、異なるマシン、さらには異なる Web アプリケーションでさえ、同じアプリの複数のインスタンスを同じインスタンスに持つことができるため、「相対」パスを作成する簡単な方法がないためです。状況。
ほとんどの Web アプリケーションは、そのような必要がある場合はいつでも db でデータをシリアル化する (LOB または同様のオブジェクトを使用する) か、何らかのサービス (FTP、cifs、nfs ...) に依存することを解決します。