0

所以我对 Javax Servlet 比较陌生,我应该在工作中修改一些代码。按照公司的要求,我不能在这里发布我的代码。所以基本上我在云服务上设置了一个服务器,并且我在该服务器上部署了我的应用程序。当我运行我的应用程序时,用户可以输入:8080/appname/resources/filename。在代码中,文件名会将我带到位于 CDN 网络上的文件的正确 url。如何通过 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 硬编码用于测试目的。

4

3 回答 3

0

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

于 2013-08-02T18:39:03.973 回答
0

在没有更多细节的情况下,概念性解决方案是打开一个输入流(文件/数据?)并读取内容,同时将读取的相同字节写入 Servlet 的输出流。

于 2013-08-02T18:40:48.227 回答
0

您可以使用URLConnectionfor 提供真实文件。以下内容可能会有所启发和帮助。您需要知道要在请求路径上替换什么(在方法中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());
    }
}

例如,请求 URL 可以转换为:

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

http://realdomain.com:8080/realappname/resources/example.txt
于 2013-08-02T18:42:07.040 回答