2013-08-02 20 views
0

因此,我對Javax Servlet比較陌生,我應該在工作中修改一些代碼。按照公司的要求,我無法發佈我的代碼所以基本上我有一臺服務器安裝在雲服務上,我在該服務器上部署了我的應用程序,當我運行我的應用程序時,用戶可以輸入:8080/appname/resources/filename在代碼中,文件名將會帶我到位於CDN網絡上的文件的正確URL,如何通過servlet將它播放回用戶?因爲它不直接駐留在我的服務器上,而是直接指向別的地方。寫一個簡單的例子來解釋我的意思從網址獲取文件並將其發送給用戶的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硬編碼用於測試目的。

+0

請寫一個簡單的例子的情況下,您不能發表的原代碼... – home

回答

0

向該服務器發出請求並回復從服務器獲得的響應。 假設你有一個在該服務器上運行的Web應用程序接受你的請求,找到該文件並回復給你。

0

沒有更多的細節可以繼續,概念性的解決方案是打開輸入流(文件/數據?)並讀取內容,同時將讀取的相同字節寫入Servlet的輸出流。

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()); 
    } 
} 

例如請求URL可以轉換來自:

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

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

謝謝。這似乎是我可以實際使用的東西。我已經寫了一個類似於covertToRemoteURL的func,我遇到的問題是如何將它讀回緩衝區。哈哈,我想這並不像我想的那麼複雜。初學者警惕! – GiangP

+0

嗯,它似乎運行良好,但它不讀取數據。它應該是一個.mkv文件。 – GiangP

+0

是否要讀取應用程序服務器本地的文件或其他應用程序服務器公開的遠程文件? –

相關問題