0

Jettyを実行し、いくつかのサーブレットといくつかのBeanを含むJavaアプリケーションがあります。すべてが.warファイルを使用して処理されます。

アーキテクチャはすでにかなり大きく、私はまだそのすべての概念を処理していませんので、私の無知を許してください。

私がやりたいことは非常に簡単です。url:filedlを指す新しいサーブレットを作成しました。

クライアントがダウンロードできるファイルをそこに保存したいだけです。たとえば、次のURLの場合:myapp / filedl / my_file.txt

ある種のディレクトリリストだけが必要で、このディレクトリへのアクセスのみを許可します。

後で、認証の追加について考えますが、これは別の問題です。

ここでの主な問題は、Jettyのすべての概念に完全に夢中になり、jetyダウンロードファイルをグーグルで検索すると、大量のダム結果が返されることです。

どんな方向でも大歓迎です!

どうも。

編集:

#npeに感謝します。ファイルをダウンロードできるようになりました。しかし、まだ奇妙なことが残っています:

  • url-mappingを/filedlに設定しましたが、/からファイルをダウンロードできます。/filedlでのみdlを許可したい
  • ダウンロードするファイルが何であれ、filedlという名前です。
  • ファイルリストにアクセスできません(エラー500)。
  <init-param>
     <param-name>dirAllowed</param-name>
     <param-value>true</param-value>
  </init-param>

私の戦争ファイルで

これがどこから来ているのか考えていますか?

もう一度Thx!

4

1 に答える 1

3

とは関係ありませんJetty

あなたがやろうとしているのServletは、静的ファイルを提供する を作成することです。

これを行うには、次のようなものを実装する必要があります。

@WebServlet(name="myAwesomeServlet", urlPatterns={"/filedl"})
public class MyAwesomeServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String fileName = (String) request.getParameter("file");
        FileInputStream fis = null;

        try {

            fis = new FileInputStream(fileName);
            response.setContentType("application/octet-stream"); 

            OutputStream out = response.getOutputStream();
            IOUtils.copy(fis, out); // this is using apache-commons, 
                                    // make sure you provide required JARs

        } finally {            

            IOUtils.closeQuietly(out);  // this is using apache-commons, 
            IOUtils.closeQuietly(fis);  // make sure you provide required JARs

        }

    }
}

を使用できない場合はServlet 3.0 API@WebServletアノテーションを削除し、サーブレットを手動で にマップしますweb.xml

次に、次のように URL を呼び出します。

http://your.awesome.server.com/filedl?file=path/to/file 

URL をより RESTful にしたい場合は、次のようにします。

http://your.awesome.server.com/filedl/file/path/to/file 

パラメータの解析方法を変更する必要があります。練習問題として残しておきます。このケースは、REST サービスとして実装するのにも適している場合があります (「Building RESTful Web Services with JAX-RS - The Java EE 6 Tutorial 」を参照)。

編集

ダウンロードするファイルを 1 つのフォルダーに何らかの方法で制限したい場合は、これを自分で実装する必要があります。たとえば、次のようにすべてのファイルを強制的に特定のフォルダー内で検索することができます。

String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);

...
fis = new FileInputStream(realFileName);

このように、/fieldl/someFile.txtfill のような URL は からファイルを提供します/my/restricted/folder/someFile.txt

于 2012-06-22T12:32:31.603 に答える