0

我有一个运行 Jetty 的 java 应用程序,并且包含几个 servlet 和一些 bean。整个事情是使用 .war 文件处理的。

架构已经很大了,我还没有处理它的所有概念,所以请原谅我的无知。

我想做的非常简单。我创建了一个指向 url 的新 servlet: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>

在我的战争文件中

知道这是从哪里来的吗?

再次感谢!

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 服务的案例(请参阅:使用 JAX-RS 构建 RESTful Web 服务 - Java EE 6 教程)。

编辑

如果您想以某种方式将下载的文件限制在单个文件夹中,则需要自己实现。例如,您可以强制在特定文件夹中查找所有文件,如下所示:

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 回答