2012-02-27 11 views
1

目的:ブラウザにhttp://xxx.com/servpage?a.mp3と入力すると、即座にこのmp3ファイルの再生を開始できるようにサーブレットを作成します。以前はファイルを静的なファイルとしてgoDaddyに置くと、私はそれを行うことができます。私のソフトウェアはすぐにそれを再生することができます。Javaを使用してmp3ストリームを実現する方法Servlet

サーブレットを使用すると、後で何を無視できるのですか?このページでmp3を動的に返すようにします(将来は他のファイルを返す可能性があるため)。私が得たものは長い待ち時間(> 20秒)であり、プレイヤーにそれをプレイさせた。

私はいくつかの例に従い、この例では「attachment」に気づいた。しかし、それを削除すると、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(ファイル)の処理を行うには、AppEngineFileのようにBlobStoreからblobを読み取る必要はありません。 blobstoreService.serve(blobKey)で直接お申し込みください。例については、Serving a Blobを参照してください。

  3. 012には、fileService.getBlobKey(readableFile)で必要なBlobKeyがあります。

更新:

はちょうどあなたがGoogleのクラウドストレージではなく、ブロブストアを使用している実現。 ACLが正しく設定されている場合は、ファイルを介して、公に表示されているGSで

、:あなたは任意の認証を行っていないのでhttp://commondatastorage.googleapis.com/BUCKETNAME/FILENAME

、あなたは公にGS上のファイルを共有して、あなたのサーブレットでちょうど301リダイレクトを行うことができますファイルのパブリックURLに変換します。

+0

ありがとう、ピーター。私はサーバーがどんな方法で悪用されることもないように、私のファイルに密かにアクセスするためのJava Web Startアプリケーションを用意しようとしていました。これを行うために、私はユーザーのIPアドレスを記録し、セッションを開始します。私はちょうどGoogleの雲のストレージにリダイレクトはそれを行うことができるとは思わない。また、私は、JavaWSが元のWebサーバーからではなくファイルにアクセスしようとしていることを示すJavaポップアップウィンドウで、ユーザーに迷惑をかけたくない。私はdoGetが返る前にGAEが何も送っていないことに気付き、1分または処理のみを許可します。したがって、ファイルを範囲に分割するか、BLOBを使用する必要があります。 –

+0

良い提案、ピーター、ちょうどブロブを試みました。ファイルが完全にロードされる前に、サーバがプッシュしているかのように、blobがファイルを提供できるように見えます。 Webサーバーが別のスレッドを使用してデータをプッシュしているように見えますので、クライアントはすぐにダウンロードしながら音楽を再生できます。あなたは基本的に私の一日を救った。感謝! –

関連する問題