2012-01-01 10 views
0

私は、サーバーマシン自体のフォルダから画像をアップロードして取得する方法を学び実装しています。しかし、私はそれを自分のwebappのディレクトリにあるフォルダに実装しています。 imageサーブレットのパスが/image/*の場合、contextのパスをserver.xmlに設定したディレクトリのフォルダにアクセスできません。 コードは以下のとおりです。 Image.java servletTomcatで自動的に新しいフォルダを作成し、アップロードしたデータを保存するにはどうすればいいですか?

public class Image extends HttpServlet { 

public static void returnFile(String filename, OutputStream out) 
     throws FileNotFoundException, IOException { 
    // A FileInputStream is for bytes 
    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(filename); 
     byte[] buf = new byte[4 * 1024]; // 4K buffer 
     int bytesRead; 
     while ((bytesRead = fis.read(buf)) != -1) { 
      out.write(buf, 0, bytesRead); 
     } 
    } finally { 
     if (fis != null) { 
      fis.close(); 
     } 
    } 
} 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    // Use a ServletOutputStream because we may pass binary information 
    ServletOutputStream out = response.getOutputStream(); 

    // Get the file to view 
    String file = request.getPathTranslated(); 

    // No file, nothing to view 
    if (file == null) { 
     out.println("No file to view"); 
     return; 
    } 

    // Get and set the type of the file 
    String contentType = getServletContext().getMimeType(file); 
    response.setContentType(contentType); 

    // Return the file 
    try { 
     returnFile(file, out); 
    } catch (Exception ex) { 
     System.out.print("\n" + ex.getMessage() + "\n"); 
     ex.printStackTrace(); 
    } 
} 

}

context variable:

<Context path="*/photos/users" docBase="G:\myApp\images\users" debug="0" reloadable="true" /> 

私が欲しいもの任意のパスにで私のWebアプリケーションに近い/データ/ユーザーよう何かを与えることです絶対パスの場所G:\ myApp \ images \ usersどのTomcat 6.x/7.xサーバマシン上でもwebappの最初のデプロイ時に動的に作成され、その中のデータにアクセスしたいときはいつでも使用できます。 私は私の質問ではっきりしていることを願っています。

+1

これは、サーブレットの仕様。マルチホストや別のコンテナを使用するときに問題が発生する可能性があります。 –

答えて

1

File.mkdirまたはFile.mkdirsを使用してディレクトリを作成できます。最初のものは指定された親にディレクトリを作成します。 2つ目は、必要に応じて親ディレクトリと "ancestor"ディレクトリを作成します。

アプリケーションが、任意の場所にディレクトリまたはファイルを作成するのに十分な特権を持って動作していない可能性があることに注意してください。また、File.mkdirsは多数のディレクトリを作成できますが、存在しないWindowsドライブ上には作成できません。したがって、mkdirmkdirsメソッドによって返されたbooleanを確認することが重要です。 (それはfalseされていれば、その後ずっとあなたがそれについてできることはありません!)


は、私はそれがウェブの外にディレクトリを使用するWebアプリケーションのために良いアイデアだとは思わない、と述べましたコンテナを作成することはできません。 @Thorbjørnのコメントによると、これは移植性とプラットフォームの問題を引き起こす可能性があり、Webアプリケーション(一般的には)を展開する際のデプロイヤのオプションを制限する可能性があります。デプロイヤーがそれを行うことを選択した場合、Webコンテナのサンドボックス化にも懸念があります。

ウェブアプリケーションの状態を永続化するためにファイルシステムを使用する場合は、デプロイヤーに手動でベースディレクトリを作成させることをお勧めします。少なくとも、Webアプリケーションが作成されている場所とその場所を知っていて、パス名が間違っていると、Webアプリケーションはこれを検出して起動を拒否することができます。これは特権の問題にも対処します。デプロイヤーは、生成された特権を持つmkdirコマンドを実行する方が良いです。

+0

'privilege'は良い点です。しかし、サーバが既存のディレクトリC:\やD:\やE:\などを持っているのか、そこに与えられている特権があるのか​​分からないのですか? – Asif

+0

@Asif - 更新された回答を見る –

関連する問題