我有一个运行Jetty的java应用程序,包含几个servlet和一些bean。 整个事情是使用.war文件处理的。
架构已经相当大了,我还没有处理它的所有概念,所以请原谅我的无知。
我想做的事情非常简单。 我创建了一个指向url:filedl的新servlet。
我只想在那里存储一个文件,客户端可以下载 例如,对于url:myapp / filedl / my_file.txt
我只需要某种目录列表,并且只允许访问此目录。
稍后,我会考虑添加身份验证,但这是另一个问题。
这里的主要问题是我在Jetty的所有概念中完全迷失了,谷歌jety下载文件返回了大量的愚蠢结果。
任何指示都将不胜感激!
THX。
修改
感谢#npe,我现在可以下载文件了。 不过还有一件奇怪的事情:
<init-param> <param-name>dirAllowed</param-name> <param-value>true</param-value> </init-param>
在我的战争文件中
知道这是从哪里来的吗?
再来一次!答案 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
的服务文件。