web-dev-qa-db-ja.com

生成されたファイルをサーブレットベースのWebアプリケーションに一時的に保存する方法

XMLファイルを生成して_/WEB-INF/pages/_に保存しようとしています。

以下は、相対パスを使用する私のコードです。

_File folder = new File("src/main/webapp/WEB-INF/pages/");
StreamResult result = new StreamResult(new File(folder, fileName));
_

ローカルマシンでアプリケーションとして実行すると正常に動作します_(C:\Users\userName\Desktop\Source\MyProject\src\main\webapp\WEB-INF\pages\myFile.xml)._

ただし、サーバーマシンにデプロイして実行すると、次の例外がスローされます。

javax.xml.transform.TransformerException:Java.io.FileNotFoundException C:\ project\Eclipse-jee-luna-R-win32-x86_64\Eclipse\src\main\webapp\WEB INF\pages\myFile.xml

getServletContext().getRealPath()も試しましたが、サーバーにnullが返されます。誰かが助けることができますか?

15
sjohnson

Nevernew File("filename.xml")などのJava EEWebアプリケーションで相対ローカルディスクファイルシステムパスを使用する。詳細な説明については、 getResourceAsStream()とFileInputStream も参照してください。

決してファイルを書き込む場所を取得する目的でgetRealPath()を使用しないでください。詳細な説明については、 servletcontext.getRealPath( "/")の意味と、いつ使用する必要があるか も参照してください。

とにかくフォルダをデプロイするためにファイルを書き込まない。詳細な説明については、 アップロードされたファイルをサーブレットアプリケーションに保存するための推奨される方法 も参照してください。

常に事前定義された絶対パス上の外部フォルダに書き込みます。

  • ハードコードされている:

    File folder = new File("/absolute/path/to/web/files");
    File result = new File(folder, "filename.xml");
    // ...
    
  • または、 多くの方法のいずれかで構成されます

    File folder = new File(System.getProperty("xml.location"));
    File result = new File(folder, "filename.xml");
    // ...
    
  • または コンテナ管理の一時フォルダ を利用する:

    File folder = (File) getServletContext().getAttribute(ServletContext.TEMPDIR);
    File result = new File(folder, "filename.xml");
    // ...
    
  • または OSが管理する一時フォルダ を利用する:

    File result = File.createTempFile("filename-", ".xml");
    // ...
    

別の方法は、(埋め込み)データベースを使用することです。

参照:

26
BalusC