2012-02-27 68 views
1

目標:構建一個servlet,以便當我在瀏覽器中輸入http://xxx.com/servpage?a.mp3時,我可以即時開始播放此mp3文件。以前如果我把文件放在goDaddy上作爲一個靜態文件,我可以做到這一點。我的軟件可以馬上播放。如何使用java實現mp3流Servlet

使用Servlet,我可以忽略後面的內容,只是希望此頁面動態返回MP3(因爲將來我可能會返回任何其他文件)。我得到的是一個漫長的等待(> 20秒),然後讓玩家玩。

我跟着一些例子,並注意到在示例中的「附件」。但是,如果我將其刪除,則mp3將無法播放。儘管我正在使用Google App Engine,但只是使用輸入/輸出流來返回http請求。任何人都可以幫忙

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException ,IOException { 
    res.setContentType("audio/mpeg3"); 
    OutputStream os = res.getOutputStream(); 
    res.setHeader("Content-Disposition", "attachment; filename="" + "a.mp3";"); 
    res.setContentLength(1000000); 
    FileService fileService = FileServiceFactory.getFileService(); 
    boolean lockForRead = false; 
    String filename = "/gs/" + BUCKETNAME + "/" + FILENAME; 
    AppEngineFile readableFile = new AppEngineFile(filename); 

    try{ 
     FileReadChannel readChannel = fileService.openReadChannel(readableFile, lockForRead); 
     InputStream is = Channels.newInputStream(readChannel); 

     int BUFF_SIZE = 1024; 
     byte[] buffer = new byte[BUFF_SIZE]; 
     try { 
      do { 
       int byteCount = is.read(buffer); 
       if (byteCount == -1) 
        break; 
       os.write(buffer, 0, byteCount); 
       os.flush(); 
      } while (true); 
     } catch (Exception excp) { 
     } finally { 
      os.close(); 
      is.close(); 
     } 
     readChannel.close(); 
    } catch(Exception e){ 
    } 
} 

回答

2

幾點注意事項:

  1. 你是不是在做 「流」。只是一個純文件下載。

  2. 要執行blob(文件)服務,您不需要從BlobStore讀取blob,就像您使用AppEngineFile所做的那樣。只需直接使用blobstoreService.serve(blobKey)即可。以Serving a Blob爲例。

  3. 您可以通過fileService.getBlobKey(readableFile)得到需要的BlobKey

更新:

你使用谷歌雲存儲,並不是BLOBSTORE剛剛意識到。

在GS,如果ACL的設置是否正確,文件是公開可見通過:http://commondatastorage.googleapis.com/BUCKETNAME/FILENAME

既然你沒有做任何認證,你可以公開分享的GS文件,然後在你的servlet只是做301重定向到該文件的公共URL。

+0

謝謝彼得。我試圖讓一個java webstart應用程序偷偷訪問我的文件,以免服務器以任何方式被濫用。爲此,我將記錄用戶的IP地址並啓動會話。我不認爲只是重定向到谷歌雲存儲可以做到這一點。另外,我不希望用戶對Java彈出窗口感到困擾,說JavaWS試圖訪問不是來自原始Web服務器的文件。我意識到GAE在doGet返回之前不會發送任何內容,只允許1分鐘或處理。所以我可能需要將文件分解爲範圍或使用blob。 – 2012-02-29 01:05:53

+0

好的建議,彼得,只是試了一下。看起來像blob可以提供文件,就好像服務器在文件完全加載之前推送一樣。我可以告訴你很可能它看起來像是Web服務器使用另一個線程來推送數據,所以我的客戶端可以在下載的同時立即播放音樂。所以你基本上節省了我的一天。不勝感激! – 2012-02-29 02:18:11