Java Jetty:客户端文件下载

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

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

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

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

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

我只需要一些目录列表,只允许访问这个目录

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

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

如有任何指示,将不胜感激

Thx

编辑:

谢谢,我现在可以加载文件了。 不过,还有一件奇怪的事:

  • 我将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时在路径中的位置。嘿,我可以下载文件,谢谢:)。不过我还是有个问题。见我的编辑不知道你要什么。。。还有什么问题?仍然不确定,但通过限制对文件系统的访问更新了答案。学习如何工作。