从URL获取文件并将其发送给用户的Servlet

时间:2013-08-02 18:12:07

标签: java tomcat servlets

所以我对Javax Servlet比较新,我应该在工作中修改一些代码。根据公司的要求,我不能在这里发布我的代码。所以基本上我有一个服务器设置在一个云服务和我在该服务器上部署了我的应用程序。当我运行我的应用程序时,用户可以键入:8080 / appname / resources / filename。在代码中,文件名将带我到位于a的文件的正确URL CDN网络。如何通过servlet将其播放回用户?因为它不是直接驻留在我的服务器上,而是指向其他地方。我会尝试写一个简单的例子来解释我的意思

procesRequest(HttpServletRequest request, HttpServletResponse reponse){
  String requestFile = request.getPathInfo();
  File file = new File(basePath,URLDecoder.decode(requestedFile, "UTF-8"));
  RandomAccessFile input = new RandomAccessFile(file, "r");
  OutputStream output = response.getOutputStream();

  playBack(input, output);
}

playBack(RandomAccessFile input, OutputStream output){
  byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
  int read;
  while ((read = input.read(buffer))>0)
  {
    output.write(buffer, 0, read);
  }
}

因此在上面的示例中,该文件将驻留在服务器本身上。并且basePath指的是服务器上存储所有文件的文件夹。所以它可以只播放文件。但是,我想修改它,以便它不是在服务器上获取文件,而是从URL获取文件并播放它。现在我只是将URL硬编码用于测试目的。

3 个答案:

答案 0 :(得分:0)

向该服务器发出请求,然后只返回从该服务器获得的响应。 如果您在该服务器上运行了一个接受请求的webapp,请找到该文件并将响应发回给您。

答案 1 :(得分:0)

如果没有更多详细信息,概念解决方案是打开输入流(文件/数据?)并读取内容,同时将相同的字节读取写入Servlet的输出流。

答案 2 :(得分:0)

您可以使用URLConnection来提供真实文件。以下可能会激发和帮助一点。您需要知道请求路径上的替换内容(在方法convertToRemoteUrl中)。

@WebServlet(urlPatterns = { "/resources/*" })
public class ResourceServlet extends HttpServlet {

    public static void copy(InputStream in, OutputStream out) 
            throws IOException {
        final byte[] buffer = new byte[1024];
        for (int length; (length = in.read(buffer)) != -1;) {
            out.write(buffer, 0, length);
        }
        out.flush();
        out.close();
        in.close();
    }

    public static URL convertToRemoteUrl(final HttpServletRequest request) 
            throws MalformedURLException {
        URL url = request.getRequestURL();
        StringBuilder sb = new StringBuilder(256);
        sb.append("http://realdomain.com");
        sb.append(url.getPath().replace(
                request.getContextPath(), "/realappname"));
        return new URL(sb.toString());
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        final URL url = convertToRemoteUrl(request);
        final URLConnection connection = url.openConnection();
        response.setContentType(connection.getContentType());
        copy(connection.getInputStream(), response.getOutputStream());
    }
}

e.g。请求URL可以从以下转换:

http://domain.com:8080/appname/resources/example.txt

http://realdomain.com:8080/realappname/resources/example.txt