Как добиться потока mp3 с помощью сервлета Java - PullRequest
1 голос
/ 27 февраля 2012

Цель: создать сервлет, чтобы при наборе в браузере http://xxx.com/servpage?a.mp3 я мог сразу же начать воспроизведение этого mp3-файла. Ранее, если я помещаю файл в goDaddy как статический файл, я могу это сделать. Мое программное обеспечение может играть прямо сейчас.

Используя сервлет, я могу игнорировать, что после ?, просто хочу, чтобы эта страница динамически возвращала 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){
    }
}

1 Ответ

2 голосов
/ 27 февраля 2012

Несколько заметок:

  1. Вы не делаете потоковую передачу. Просто загрузка файла.

  2. Чтобы выполнять обслуживание BLOB-объектов (файлов), вам не нужно читать BLOB-объекты из BlobStore, как при работе с AppEngineFile. Просто подайте его напрямую с blobstoreService.serve(blobKey). См. Обслуживание BLOB-объектов для примера.

  3. Вы можете получить BlobKey, необходимый в 2. через fileService.getBlobKey(readableFile).

Обновление:

Только что понял, что вы используете Google Cloud Storage, а не BlobStore.

В GS, если ACL установлены правильно, файлы становятся общедоступными через: http://commondatastorage.googleapis.com/BUCKETNAME/FILENAME

Поскольку вы не выполняете никакой аутентификации, вы можете публично поделиться файлом на GS, а затем в своем сервлете просто перенаправить 301 на общедоступный URL-адрес файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...