Java Jetty:客户端文件下载
我有一个运行Jetty的java应用程序,它包含几个servlet和一些bean。 整个过程都是使用.war文件处理的 这个架构已经相当大了,我还没有处理好它的所有概念,所以请原谅我的无知 我想做的事情非常简单。 我创建了一个指向url:filedl的新servlet 我只想在那里存储一个文件,客户端可以下载 例如url:myapp/filedl/my_file.txt 我只需要一些目录列表,只允许访问这个目录 稍后,我将考虑添加身份验证,但这是另一个问题 这里的主要问题是,我完全迷失在Jetty的所有概念中,谷歌搜索jety下载文件会返回大量愚蠢的结果 如有任何指示,将不胜感激 Thx 编辑: 谢谢,我现在可以加载文件了。 不过,还有一件奇怪的事:Java Jetty:客户端文件下载,java,jetty,download,embedded-jetty,Java,Jetty,Download,Embedded Jetty,我有一个运行Jetty的java应用程序,它包含几个servlet和一些bean。 整个过程都是使用.war文件处理的 这个架构已经相当大了,我还没有处理好它的所有概念,所以请原谅我的无知 我想做的事情非常简单。 我创建了一个指向url:filedl的新servlet 我只想在那里存储一个文件,客户端可以下载 例如url:myapp/filedl/my_file.txt 我只需要一些目录列表,只允许访问这个目录 稍后,我将考虑添加身份验证,但这是另一个问题 这里的主要问题是,我完全迷失在Jett
- 我将url映射设置为/filedl,但我可以从/下载文件。我只允许在/filedl中使用dl
- 无论我下载什么文件,它都被命名为filedl
- 我没有访问文件列表的权限(错误500),即使我有
肮脏的
真的
在我的战争档案里
知道这是从哪里来的吗
又来了 它与
码头
无关
您试图做的是创建一个服务于静态文件的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
}
}
}
http://your.awesome.server.com/filedl/file/path/to/file
String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);
...
fis = new FileInputStream(realFileName);
如果无法使用Servlet 3.0 API
,请删除@WebServlet
注释,并在web.xml
中手动映射Servlet
然后像这样调用URL:
http://your.awesome.server.com/filedl?file=path/to/file
如果希望URL更加RESTful,如下所示:
@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
}
}
}
http://your.awesome.server.com/filedl/file/path/to/file
String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);
...
fis = new FileInputStream(realFileName);
您需要对参数的解析方式进行一些更改。我把它作为练习留给你。这种情况也可以作为REST服务来实现(请参阅:)
编辑
如果您想以某种方式将下载的文件限制在单个文件夹中,您需要自己实现这一点。例如,您可以强制在特定文件夹中查找所有文件,如下所示:
@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
}
}
}
http://your.awesome.server.com/filedl/file/path/to/file
String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);
...
fis = new FileInputStream(realFileName);
通过这种方式,像
/fieldl/someFile.txt
这样的URL会填充/my/restricted/folder/someFile.txt
中的文件,它与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
}
}
}
http://your.awesome.server.com/filedl/file/path/to/file
String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);
...
fis = new FileInputStream(realFileName);
如果无法使用Servlet 3.0 API
,请删除@WebServlet
注释,并在web.xml
中手动映射Servlet
然后像这样调用URL:
http://your.awesome.server.com/filedl?file=path/to/file
如果希望URL更加RESTful,如下所示:
@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
}
}
}
http://your.awesome.server.com/filedl/file/path/to/file
String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);
...
fis = new FileInputStream(realFileName);
您需要对参数的解析方式进行一些更改。我把它作为练习留给你。这种情况也可以作为REST服务来实现(请参阅:)
编辑
如果您想以某种方式将下载的文件限制在单个文件夹中,您需要自己实现这一点。例如,您可以强制在特定文件夹中查找所有文件,如下所示:
@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
}
}
}
http://your.awesome.server.com/filedl/file/path/to/file
String fileName = (String) request.getParameter("file");
File realFileName = new File("/my/restricted/folder", fileName);
...
fis = new FileInputStream(realFileName);
通过这种方式,像
/fieldl/someFile.txt
这样的URL会从/my/restricted/folder/someFile.txt
Thx中填充服务文件。对于信息,我对Jetty的关注主要是我一直收到404。我无法找到实际获取web应用程序根文件夹的方法。事实上,我是一名web开发新手肯定没有帮助:在servlet中执行以下操作:新文件(“.”)。getAbsolutePath()
应该会显示运行servlet时在路径中的位置。嘿,我可以下载文件,谢谢:)。不过我还是有个问题。见我的编辑不知道你要什么。。。还有什么问题?仍然不确定,但通过限制对文件系统的访问更新了答案。了解如何工作。Thx的信息,我对Jetty的关注主要是我得到404的所有时间。我无法找到实际获取web应用程序根文件夹的方法。事实上,我是一名web开发新手肯定没有帮助:在servlet中执行以下操作:新文件(“.”)。getAbsolutePath()
应该会显示运行servlet时在路径中的位置。嘿,我可以下载文件,谢谢:)。不过我还是有个问题。见我的编辑不知道你要什么。。。还有什么问题?仍然不确定,但通过限制对文件系统的访问更新了答案。学习如何工作。