ある種のアクセス制御を使用して、バイナリ ファイルを提供できるようにしたいと考えています。コントロールはかなり複雑なので、単純に Apache にファイルを提供させることはできません。Zend Framework 2 アプリを使用して、PHP 経由で提供する必要があります。アクションは次のようになります。
public function sendAction() {
$filename = /* database action */;
$size = filesize($filename);
$response = $this->getResponse();
if($this->getRequest()->getHeaders()->has('Range')) {
list($unit, $range) = explode('=', $this->getRequest()->getHeaders()->get('Range')->toString());
$ranges = explode(',', $range);
$ranges = explode('-', $ranges[0]);
$start = (int)$ranges[0];
$end = (int)(isset($ranges[1]) ? $ranges[1] : $size - 1);
$length = $start - $end;
$response->getHeaders()->addHeaders(array('Content-Type' => 'audio/mpeg', 'Accept-Ranges' => 'bytes', 'Content-Length' => $length - 1));
$response->setStatusCode(206);
$f = fopen($filename, 'r');
if($start) fseek($f, $start);
$out = '';
while($length) {
$read = ($length > 8192) ? 8192 : $length;
$length -= $read;
$out .= fread($fp,$read);
}
fclose($f);
$response->setContent($out);
} else {
$response
->setContent(file_get_contents($filename))
->getHeaders()->addHeaders(array('Content-Type' => 'audio/mpeg', 'Accept-Ranges' => 'bytes'));
}
return $this->getResponse();
}
1つには、ファイルが提供される前に常にRAMに完全にロードされるため、これは非常に非効率的であると確信しています。
ただし、これは機能しないようです。ファイルにアクセスしようとするとaudio/mpeg
、Chrome で正しいプレーヤーが取得されますが、ブラウザは要求をキャンセルして停止します。オーディオをまったく再生できません。
Zend 2 で 206 応答を正しい方法で実装する方法について、ウェブ上でヒントを見つけることができませんでした。おそらく誰かがここで私を助けることができます。