2012-02-27 2 views
1

목표 : 서블릿을 빌드하여 브라우저에 http://xxx.com/servpage?a.mp3을 입력하면 즉시이 MP3 파일의 재생을 시작할 수 있습니다. 이전에 파일을 goDaddy에 정적 파일로 저장하면 그 작업을 수행 할 수 있습니다. 내 소프트웨어에서 즉시 재생할 수 있습니다.자바 서블릿을 사용하여 mp3 스트림을 얻는 방법

서블릿을 사용하면 이후에 나오는 내용을 무시할 수 있습니다.이 페이지에서 mp3를 동적으로 반환하기를 원합니다 (앞으로 다른 파일을 반환 할 수 있기 때문에). 내가 가진 것은 오래 기다려서 (> 20 초), 그 플레이어에게 게임을하게했다.

나는 몇 가지 예를 따랐으며 예제에서 "attachment"에 주목했습니다. 그러나, 내가 그것을 제거하면 mp3도 재생되지 않습니다. 나는 Google App Engine을 사용하지만 http 요청을 반환하기 위해 input/outputstream을 사용한다. 누구든지 도울 수 있니?

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. bllob (파일) 검색을 수행하려면 AppEngineFile과 같이 BlobStore에서 blob을 읽을 필요가 없습니다. blobstoreService.serve(blobKey)으로 직접 제공하십시오. 예를 들어 Serving a Blob을 참조하십시오.

  3. 012.을 통해 2.에서 필요한 BlobKey을 얻을 수 있습니다.

업데이트 :

그냥 당신이 Blob 저장소 Google 클라우드 스토리지를하지 사용 깨달았다. ACL을 제대로 설정하는 경우 GS에서

는, 파일은 통해 공개 : http://commondatastorage.googleapis.com/BUCKETNAME/FILENAME

당신이 어떤 인증을하고 있지 않기 때문에, 당신은 공개적으로 GS에 파일을 공유 한 다음 서블릿에서 단지 301 리디렉션을 할 수 파일의 공개 URL에 추가하십시오.

+0

고마워요, 피터. 서버가 어떤 식 으로든 남용되지 않도록 비밀리에 내 파일에 액세스 할 수있는 java webstart 응용 프로그램을 사용하려고했습니다. 이렇게하려면 사용자의 IP 주소를 기록하고 세션을 시작합니다. 나는 구글 클라우드 스토리지로 리다이렉트 할 수 있다고 생각하지 않는다. 또한 사용자가 JavaWS가 원래 웹 서버가 아닌 파일에 액세스하려고한다는 팝업 창이 뜨면 방해 받기를 원하지 않습니다. doGet이 반환되기 전에 GAE가 아무 것도 보내지 않고 1 분만 처리 할 수 ​​있다는 것을 깨달았습니다. 따라서 파일을 범위로 분할하거나 BLOB를 사용해야 할 수도 있습니다. –

+0

좋은 제안, 피터, 그냥 방울을 시도했다. 파일이 완전히로드되기 전에 blob이 서버를 밀어 넣는 것처럼 파일을 제공 할 수 있습니다. 웹 서버가 다른 스레드를 사용하여 데이터를 푸시하는 것처럼 보일 수도 있으므로 고객이 다운로드하는 동안 음악을 바로 재생할 수 있습니다. 그래서 너는 기본적으로 나의 날을 구했다. 감사! –

관련 문제