2016-12-23 3 views
0

У меня есть node.js, и я бы хотел передать аудиофайлы в браузер. Вот мой маршрут:Node.js как передать аудиофайл

routes['/v1/tracks/:id/file'] = { 
    get: async (ctx, next) => { 
    let tracks = await File.find({ 
     trackId: ctx.params.id, 
     sort: 'bitrate', 
     direction: 'desc', 
     limit: 3 
    }); 
    let stat = fs.statSync(tracks[0].data.path); 
    let mimeType = 'audio/mpeg'; 

    let opts = {}, res = 200; 

    let resHeaders = { 
     'Content-Type': mimeType, 
     'Content-Length': stat.size, 
     'Accept-Ranges': 'bytes' 
    }; 
    if (ctx.headers.accept !== '*/*') { 
     ctx.res.writeHead(200, resHeaders); 
     return; 
    } 
    if (ctx.headers['range']) { 
     let [b, range] = ctx.headers['range'].split('='); 
     console.log(b, range); 
     if (b === 'bytes') { 
     let [start, end] = range.split('-'); 

     if (!end || end === '' || end < start) 
      end = stat.size; 

     opts = { 
      start: start - 0, 
      end: end - 0 
     }; 

     res = 206; 
     resHeaders['Content-Range'] = `bytes ${start}-${end}/${stat.size}`; 
     } 
    } 
    ctx.res.writeHead(res, resHeaders); 

    ctx.body = fs.createReadStream(tracks[0].data.path, opts); 
    } 
} 

Затем, когда я пытаюсь получить доступ к URL-адресу в хроме, он отправляет два запроса.

Первый один:

Request Headers: 
    GET /v1/tracks/ghHxLPNt8Fayfx1d/file HTTP/1.1 
    Host: localhost:3000 
    Connection: keep-alive 
    Upgrade-Insecure-Requests: 1 
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
    Accept-Encoding: gzip, deflate, sdch, br 
    Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Response Headers: 
    HTTP/1.1 200 OK 
    X-Powered-By: Express 
    Content-Type: audio/mpeg 
    Content-Length: 5986643 
    Accept-Ranges: bytes 
    Date: Fri, 23 Dec 2016 14:09:27 GMT 
    Connection: keep-alive 

Второй один:

Request headers: 
    GET /v1/tracks/ghHxLPNt8Fayfx1d/file HTTP/1.1 
    Host: localhost:3000 
    Connection: keep-alive 
    Accept-Encoding: identity;q=1, *;q=0 
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36 
    Accept: */* 
    Referer: http://localhost:3000/v1/tracks/ghHxLPNt8Fayfx1d/file 
    Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
    Range: bytes=0- 
Response headers: 
    HTTP/1.1 206 Partial Content 
    X-Powered-By: Express 
    Content-Type: audio/mpeg 
    Content-Length: 5986643 
    Accept-Ranges: bytes 
    Content-Range: bytes 0-5986643/5986643 
    Date: Fri, 23 Dec 2016 14:09:28 GMT 
    Connection: keep-alive 

Однако это не работает. Chrome просто показывает пустую дорожку с кнопкой воспроизведения, но ничего не показывает длину трека, и я не могу с ней взаимодействовать. Safari просто показывает загрузку.

EDIT:

Если удалить кучу кода (все о частичном содержании) я могу получить его работу, но она не отпустит меня в положение, только играть от начала до конец. Кроме того, я могу загрузить его с кодом, я написал здесь (Ctrl +S), а затем воспроизвести его просто отлично

ответ

0

ОК, наконец, после того, как рытье много, один байт был причиной этой проблемы.

Новый код:

if (ctx.headers['range']) { 
    let [b, range] = ctx.headers['range'].split('='); 
    console.log(b, range); 
    if (b === 'bytes') { 
    let [start, end] = range.split('-'); 

    if (!end || end === '' || end < start) 
     end = stat.size - 1; 

    opts = { 
     start: start - 0, 
     end: end - 0 
    }; 

    res = 206; 
    resHeaders['Content-Range'] = `bytes ${start}-${end}/${stat.size}`; 
    resHeaders['Content-Length'] = end - start + 1; 
    } 
} 

Смотрите также Streaming a video file to an html5 video player with Node.js so that the video controls continue to work?

Смежные вопросы