2012-02-27 107 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