Jetty:客户端文件下载

时间:2012-06-22 11:37:32

标签: java jetty download embedded-jetty

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

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

我想做的事情非常简单。 我创建了一个指向url:filedl的新servlet。

我只想在那里存储一个文件,客户端可以下载 例如,对于url:myapp / filedl / my_file.txt

我只需要某种目录列表,并且只允许访问此目录。

稍后,我会考虑添加身份验证,但这是另一个问题。

这里的主要问题是我在Jetty的所有概念中完全迷失了,谷歌jety下载文件返回了大量的愚蠢结果。

任何指示都将不胜感激!

THX。

修改

感谢#npe,我现在可以下载文件了。 不过还有一件奇怪的事情:

  • 我将url-mapping设置为/ filedl,但我可以从/下载文件。我想仅允许dl in / filedl
  • 无论我下载什么文件,都会命名为filedl。
  • 即使我有
  • ,我也无法访问文件列表(错误500)
  <init-param>
     <param-name>dirAllowed</param-name>
     <param-value>true</param-value>
  </init-param>

在我的战争文件中

知道这是从哪里来的吗?

再来一次!

1 个答案:

答案 0 :(得分: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中手动映射servlet。

然后只需调用这样的URL:

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

如果您希望网址更加RESTful,请执行以下操作:

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

您需要对解析参数的方式进行一些更改。我会把它作为锻炼给你。这种情况也可能是将其作为REST服务实现的好例子(参见:Building RESTful Web Services with JAX-RS - The Java EE 6 Tutorial)。

修改

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

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

...
fis = new FileInputStream(realFileName);

这样,/fieldl/someFile.txt之类的网址会导致来自/my/restricted/folder/someFile.txt的服务文件。